直接插入排序&希尔排序
1.直接插入排序
时间复杂度O(n2)
工作原理:
通过构建有序序列,对于未排序数据,在已排序的序列中,从后向前扫描,找到相应的位置并插入。
插入排序在实现上,在从后向前扫描的过程中,需要反复把已排序元素逐步向后移动,为最新元素提供插入空间。
1 2 3 4 5 6 7 8 9 10 11 | //直接插入排序 public static void InsertSort( int [] a, int n){ int i,j,t; for (i= 1 ;i<n;i++){ t=a[i]; //取出一个未排序的数据 for (j=i- 1 ;j>= 0 &&t<a[j];--j){ //在已排序的序列这查找位置,t<a[j],说明要把t插入到前面去 a[j+ 1 ]=a[j]; //向后移动数据 } a[j+ 1 ]=t; //将临时元素插入到腾出的位置中 } } |
2.希尔排序
希尔排序是插入排序的一种高效率的实现,也叫缩小增量排序。简单的插入排序中,如果待排序列是正序时,时间复杂度是O(n),如果序列是基本有序的,使用直接插入排序效率就非常高。希尔排序就利用了这个特点。
基本思想是:先将整个待排记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录基本有序时再对全体记录进行一次直接插入排序。
(1)间隔的计算:
间隔h的初始值为1,通过h=3*h+1来循环计算,直到该间隔大于数组的大小时体质。最大间隔不大于数组大小的最大值,如:数组长度为10,最大间隔可以为4
(2)间隔的减少:
可以通过h=(h-1)/3来计算
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | package com.sort; /*希尔排序*/ public class ShellSort { public static void shellSort( int [] arr){ //初始化一个间隔 int h= 0 ; //计算最大间隔 while (h<arr.length/ 3 + 1 ) { //当arr.length=10时,发现h=4时合适 h=h * 3 + 1 ; } while (h> 0 ) { //进行插入排序 int target= 0 ; for ( int i = h; i < arr.length; i++) { //i=1是第二个数,假设第一个数的位置是正确的;要往后移,必须要假设第一个 target=arr[i]; //待插入的 int j=i; //后移 while (j>h- 1 && target<=arr[j-h]) { arr[j]=arr[j-h]; //按间隔的距离得到要交换的两个数 j-=h; } arr[j]=target; } //减小间隔 h=(h- 1 )/ 3 ; } } } TestShellSort package com.sort; public class TestShellSort { public static void main(String[] args) { int [] arr= new int [ 9 ]; arr[ 0 ]= 9 ; arr[ 1 ]= 1 ; arr[ 2 ]= 5 ; arr[ 3 ]= 8 ; arr[ 4 ]= 3 ; arr[ 5 ]= 7 ; arr[ 6 ]= 4 ; arr[ 7 ]= 6 ; arr[ 8 ]= 2 ; System.out.print( "[" ); for ( int num : arr) { System.out.print(num+ " " ); } System.out.print( "]" ); System.out.println(); ShellSort.shellSort(arr); System.out.print( "[" ); for ( int num : arr) { System.out.print(num+ " " ); } System.out.print( "]" ); System.out.println(); } } |
栗子:
有些排序算法在每趟排序过程中,都会有一个元素被放置在其最终的位置上,下列算法不会出现此情况的是()
正确答案: A 你的答案: D (错误)
A.希尔排序
B.堆排序
C.起泡排序
D.快速排序
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!