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

一、插入排序

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;
            }
        }
    }

 

posted @ 2018-03-25 16:51  菩提本无树呀~  阅读(218)  评论(0编辑  收藏  举报