目录
1、直接插入排序
1.1、基本思想
1.2、算法实现
1.3、算法性能
2 .对折插入排序
2.1、基本思想
2.2、算法实现
2.3、算法性能
3、希尔排序
3.1、基本思想
3.2、算法实现
3.3、算法性能
插入排序的基本思想是,在所有插入操作完成之前,在每个会话中插入要排序的元素,并将其插入到按关键字值大小排序的文件部分的相应位置。
博主今天介绍直接插入排序、对折插入排序、希尔排序三种插入排序方法
1、直接插入排序1.1、基本思想直接插入排序是最简单的排序方式,其过程是将各要素按顺序插入一个有序序列中。 假设元素存在R[0.i-1]是已经排序的元素区域((简称规则区域,初始规则区域中只有一个元素) )。 R[i.n-1]是未排序的元素区域(无序区域)。 插入排序将R[i]插入R[0.i-1],以便R[0.i]有序。 插入R[i]的过程完成了序列中的一次,扩大了有序区域,最终R[0.n-1]都是有序的。
1.2、算法的实现/*straight insert sort最重要的是对顺序区域(即带有顺序号的区间),按照降序向前进行比较(/# includeiostreamintstraight _ insert I ) inttemp=*(arrI ); for(intj=I-1; j=0; -j () if(arr[j1]=arr[j] ) break; else { arr[j 1]=arr[j 1] arr[j]; arr[j]=arr[j 1] - arr[j]; arr[j 1]=arr[j 1] - arr[j]; } } } return 0; (}int main ) ) intarr(10 )={ 1,0,7,6,9,5,8,3,4,2 }; straight_insert(ARR,sizeof(ARR )/sizeof ) ARR[0] ); 返回0; }算法执行结果:
1.3、算法性能直接插入排序算法的时间复杂度:最高o(n )、最坏o )、平均o ) ) n )。
空间复杂性: o(1)。
稳定性:稳定性
复杂性:简单性
2、对半插入顺序2.1、基本思想我们的直接插入搜索从有序区的后向前每次都是反向一致的,这样有点低效。 对折插入搜索是指对规则区域进行对折搜索并插入,然后将相应的元素向后移动。
2.2、算法实现/* binaryinsertsort */# includeiostreamintbinary _ search (intarr [ ],int length,int key ) intlow=0,0 if(ARR[mid]key ) high=mid-1; else low=mid 1; (} return high; }intbinary_insert(intarr[],int length ) ) for ) intI=1; i length; I ) inttemp=*(arrI ); intinsertsite=binary _ search (arr,i-1,temp ); for(intj=I-1; j insertSite; -j({arr[j1]=arr[j]; } arr[insertSite 1]=temp; } return 0; (}int main ) ) intarr(10 )={ 1,0,7,6,9,5,8,3,4,2 }; binary_insert(arr,sizeof ) arr )/sizeof ) arr[0] ); 返回0; }
上述算法的实现精髓是high值,例如,原始阵列为{ 1,2,7,7,7,7,8 },但此时插入的key值插入在7和8之间,而不是任意7的两侧。 这也由arr[mid] key决定。
2.3、算法性能时间复杂度: o(1) )。
空间复杂性:对折插入排序只会减少关键字之间的比较次数,元素的移动次数不变。 因此,对半插入排序的平均时间复杂度仍然为o(n )。
3、希尔排序3.1、基本思想希尔排序又称最小增量排序方法,其基本思想是将要素按下标的一定增量进行分组,将各组要素采用直接插入法进行排序。 随着增量的减小,组中包含的要素逐渐增加,d减少到1时,整个数组只剩下一个组,此时数组就完成了排序。
3.2、算法实现/* shell sort */# includeiostreamintshellsort (intarr [ ],int arr_size ) { int range=arr_size/2, wile(range0) for ) intI=range; i arr_size; I ) { int temp=arr[i]; j=i - range; while(j=0temparr[j] ) { arr[j range]=arr[j]; j=j-range; } arr[j range]=temp; } range=range/2; }返回0; (}int main ) ) intarr(10 )={ 1,0,7,6,9,5,8,3,4,2 }; intARR_size=sizeof(arr )/sizeof ) arr(0); 壳快照(ARR,arr_size ); 返回0; }
3.3、算法性能时间复杂度: o () )。
空间复杂性: o(1) ) ) ) ) )的空间复杂性。
稳定性:不稳定
复杂性:复杂性