一:插入排序
基本介紹:
插入排序:對想要排序的序列以插入的方式尋找該元素適當的位置,以達到排序的目的。
基本思想:
把n個待排序的元素看成一個有序表和一個無序表,開始時有序表中只有一個元素,無序表中包含n-1個元素。那麼排序的過程就是每次從無序表中取出第一個元素,把它的排序碼依次與有序表中的有序碼進行比較,將它插入到有序表中的適當位置,使其成爲新的有序表。
代碼:
public static void InsertSort(int[] array){
for (int i = 1;i<array.length;i++){
int insertVal = array[i]; //要插入的數據
int insertIndex = i-1; //從要插入的數據的前一個下標的數據進行比較
while (insertIndex>=0&&array[insertIndex]>insertVal){
array[insertIndex+1] = array[insertIndex];
insertIndex--;
}
if (insertIndex+1!=i){
array[insertIndex+1] = insertVal;
}
}
System.out.println(Arrays.toString(array));
}
希爾排序
簡單插入排序存在問題:
數組:{2,3,4,5,6,1},這時需要插入的數1是最小的,那麼插入過程是:
{2,3,4,5,6,6}
{2,3,4,5,5,6}
{2,3,4,4,5,6}
{2,3,3,4,5,6}
{2,2,3,4,5,6}
{1,2,3,4,5,6}
通過以上案例不難發現:當需要插入的數據是較小的數據,後移次數明顯增多,對效率有很大的影響。因此引入希爾排序
一:希爾排序
基本介紹:
希爾排序是希爾於1959年提出的一種排序算法。希爾排序也是一種插入排序,它是將簡單插入排序算法經過改進的一個更高效的版本,也稱爲縮小增量排序。
基本思想:
希爾排序是把記錄按下標的一定增量分組,對每組使用直接插入排序算法進行排序,隨着增量逐漸減少,每組包含的關鍵詞越來越少,當增量減至1的時候,整個文件就恰好被分成一組,算法便終止。
示意圖:
代碼
希爾排序有兩種方法:交換法,移動法。交換法的排序速度要遠小於移動法
** 採用交換法:**
public static void shellSorted(int[] array){
int temp;
for (int gap = array.length/2;gap>0;gap /=2){
for (int i = gap;i<array.length;i++){
for (int j = i-gap;j>=0;j-=gap){
if (array[j+gap]<array[j]){
temp = array[j];
array[j] = array[j+gap];
array[j+gap] = temp;
}
}
}
System.out.println(Arrays.toString(array));
}
}
移動法:
public static void shellSorted2(int[] array){
//分組
for (int gap = array.length/2;gap>0;gap /=2){
for (int i=gap;i<array.length;i++){
//插入法
int insertIndex = i;
int insertVal = array[i];
if (array[insertIndex]<array[insertIndex-gap]){
while (insertIndex-gap >=0&&insertVal<array[insertIndex-gap]){
array[insertIndex] = array[insertIndex-gap];
insertIndex-=gap;
}
array[insertIndex] = insertVal;
}
}
}
System.out.println(Arrays.toString(array));
}
在使用移動法實現希爾排序的時候,是使用到了插入排序算法