排序之插入排序:直接插入和希尔排序

Posted lizijiangmm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序之插入排序:直接插入和希尔排序相关的知识,希望对你有一定的参考价值。

一、插入排序

1、思想:原理类似抓扑克牌,在有序表中进行插入和查找,插入合适的位置时,之后的元素需要往后移动

2、时间复杂度:

最好:O(N),正序情况,只有比较时间,无移动时间

最坏:O(N2),逆序情况

平均:O(N2)

3、辅助空间:O(1)

4、稳定性:稳定

5、适用场合:适用于初始序列基本有序的情况,或者n小的时候,插入排序效率高

 1     public static void insertSort(int[] a) {
 2         int target,i,j;
 3         for(j = 1;j<a.length;j++) {//当前带插入的元素下标
 4             target = a[j];
 5             while(j>0&&target < a[j-1]) {
 6                 a[j] = a[j-1];//向后移动
 7                 j--;
 8             }
 9             a[j] = target;
10         }
11     }
12         

二、希尔排序

1、思想:先将整个待排记录序列分割成若干子序列分别进行直接插入排序,待整个记录基本有序时,再对整个记录进行一趟插入排序,步长最后必减少为1

2、时间复杂度:

最好:O(N1.3)

最坏:O(N2)

平均:根据步长不同

3、辅助空间:O(1)

4、稳定性:不稳定,插入排序本身稳定,但是由于有步长,所以不稳定

5、适用场合:关键字较小的记录就不是一步一步地向前挪动,而是跳跃式地往前移,从而使得进行最后一趟排序时,整个序列已经做到基本有序,只要作记录的少量比较和移动即可。因此希尔排序的效率要比直接插入排序高。

public static void shellSort(int[] a) {
        int i,j,r,temp;
        for(r = a.length/2;r >= 1;r = r/2) { //r为步长
            for(i = r;i < a.length;i++) {
                temp = a[i];
                j = i - r;
                while(j >= 0 && temp < a[j]) {
                    a[j+r] = a[j];
                    j-= r;
                }
                a[j+r] = temp;
            }
        }
    }

 

以上是关于排序之插入排序:直接插入和希尔排序的主要内容,如果未能解决你的问题,请参考以下文章

插入排序算法之直接插入排序和希尔排序

排序算法之插入排序(直接插入排序折半插入排序希尔排序)

插入排序之直接插入排序和希尔排序

排序之插入排序:直接插入和希尔排序

算法之直接插入排序和希尔排序

数据结构(14)---排序之插入排序(直接插入排序, 希尔排序)和选择排序(直接选择排序, 堆排序)