排序演算法(三) 插入排序及改進

2021-08-10 15:32:19 字數 2564 閱讀 4693

在要排序的一組數中,假設前面(n-1)[n>=2] 個數已經是排好順序的,現在要把第n個數找到相應位置並插入,使得這n個數也是排好順序的。如此反覆迴圈,直到全部排好順序。

//插入排序  

public void insertionsort()

array[insertpoint+1]= temp; //找到了插入位置,插入待排序元素

system.out.print("第"+counter+"輪排序結果:");

display();

counter++;

} }

在第一趟排序中,插入排序最多比較一次,第二趟最多比較兩次,依次類推,最後一趟最多比較n-1次。因此有:

1+2+3+...+n-1 =n*n(n-1)/2

因為在每趟排序發現插入點之前,平均來說,只有全體資料項的一半進行比較,我們除以2得到:

n*n(n-1)/4

複製的次數大致等於比較的次數,然而,一次複製與一次比較的時間消耗不同,所以相對於隨機資料,這個演算法比氣泡排序快一倍,比選擇排序略快。

與氣泡排序、選擇排序一樣,插入排序的時間複雜度仍然為o(n2),這三者被稱為簡單排序或者基本排序三者都是穩定的排序演算法

如果待排序陣列基本有序時,插入排序的效率會更高。

在插入某個元素之前需要先確定該元素在有序陣列中的位置,上例的做法是對有序陣列中的元素逐個掃瞄,當資料量比較大的時候,這是乙個很耗時間的過程,可以採用二分查詢法改進,這種排序也被稱為二分插入排序

改進後的**如下:

//二分插入排序  

public void binaryinsertionsort()

array[insertindex]= temp; //插入待排序元素到正確的位置

} system.out.print("第"+counter+"輪排序結果:");

display();

counter++;

} }

/**

* 二分查詢法

* @param lowerbound 查詢段的最小下標

* @param upperbound 查詢段的最大下標

* @param target 目標元素

* @return 目標元素應該插入位置的下標

*/

public int binarysearch(int lowerbound,int upperbound,int target)else

} return lowerbound;

}

還有一種在二分插入排序的基礎上進一步改進的排序,稱為2-路插入排序,其目的是減少排序過程中移動記錄的次數,但為此需要n個記錄的輔助空間。

演算法的思想為:另設乙個和原始待排序列l相同的陣列d,首先將l[1]複製給d[1],並把d[1]看成是已排好序的序列中處於中間位置的元素(樞紐元素),之後將l中的從第二個元素開始依次插入到陣列d中,大於d[1]的插入到d[1]之後的序列(此處我稱為右半邊序列,用的是陣列左半部分空間),小於d[1]的插入到d[1]之前的序列(左半邊序列,用的是陣列右半部分空間)。

該演算法將陣列當做首尾銜接的環形結構來使用。

示意圖如下:

排序完成之後,陣列中的元素並不是按照下標公升序排列的,而是靠first與final指標確定起始元素。

注意:當l[1]為最小值時,2-路插入排序失去它的優越性,等同於二分插入排序。

**如下:

//2-路插入排序  

public void two_wayinsertionsort()else if(array[i] < newarray[first])else if(array[i] >= newarray[0])while(newarray[curindex]>array[i]);

newarray[curindex+1]= array[i]; //插入到正確的位置

}elsewhile(newarray[curindex]<=array[i]);

newarray[(curindex-1+len)%len]= array[i]; //插入到正確的位置

} for(int j=0;j如果對如下陣列進行排序

8,1,11,12,4,20,7,2,6,15

列印結果如下:

此時,first指向下標為5的元素(1),last指向下標為4的元素(20)

插入排序的改進演算法 希爾排序

希爾排序 shell s sort 又稱縮小增量排序,類屬於插入排序。考慮到直接插入排序得一下特點 1 在待排序數基本有序情況下排序效率大大提高 2 在n很小時,其排序效率也很高。基於以上考慮,對直接插入排序進行改進,並得出希爾排序。其基本思想為 先將整個待排序記錄序列分割成若干子串行分別進行直接插...

排序演算法(三)插入排序

今天來更新排序演算法中的第三種演算法 插入排序插入排序是基於比較的排序。所謂的基於比較,就是通過比較陣列中的元素,看誰大誰小,根據結果來調整元素的位置 因此,對於這類排序,就有兩種基本的操作 比較操作 交換操作其中,對於交換操作,可以優化成移動操作,即不直接進行兩個元素的交換,還是用乙個樞軸元素 t...

排序演算法(三) 插入排序

一 直接插入排序 最差時間複雜度 o n 2 最優時間複雜度 o n 平均時間複雜度 o n 2 穩定性 穩定 直接插入排序 insertion sort 是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對未排序的資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。插入排序演算法的一般...