常用的排序算法分爲
- 交換排序 ( 冒泡排序 / 快速排序 ) https://blog.csdn.net/qq_39731011/article/details/95204290
- 插入排序 ( 簡單插入排序 / 希爾排序 ) https://blog.csdn.net/qq_39731011/article/details/95342246
- 選擇排序 ( 簡單選擇排序 / 堆排序 ) https://blog.csdn.net/qq_39731011/article/details/95457842
- 歸併排序 https://blog.csdn.net/qq_39731011/article/details/95614787
- 基數排序 ( 桶排序 ) https://blog.csdn.net/qq_39731011/article/details/95995693
今天要說的是:插入排序
插入排序 顧名思義,對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入
如下文中,您有別的見解,歡迎評論指正,深海謝過諸位靈長類
簡單插入排序
依據深海的理解舉一個簡單的例子:
未排序序列是:[5,9,8,4,2]
已排序序列是:暫時沒有.
第一次執行插入: 將5拿出來 放到已排序序列
執行後:
未排序序列是:[9,8,4,2]
已排序序列是:[5]
第二次執行插入: 將9拿出來, 從已排序序列從後向前掃描,發現對應的位置在5的後面
執行後:
未排序序列是:[8,4,2]
已排序序列是:[5,9]
第二次執行插入: 將8拿出來, 從已排序序列從後向前掃描,發現對應的位置在5和9的中間
執行後:
未排序序列是:[4,2]
已排序序列是:[5,8,9]
以此類推,最終排序完成
public int[] Test() {
int[] array={5,9,8,4,2};
int i,j,temp; //temp 正在執行插入的數
for(i=1;i<array.length;i++) {
temp=array[i];
for(j=i-1;j>=0;j--) {
if (temp > array[j]) { //順序正確,停止探索
break;
}else{//元素後移
array[j+1] = array[j];
}
}
array[j+1]=temp;
}
return array;
}
希爾排序
希爾排序呢就是簡單插入排序的升級版,
原理如下:
1.在邏輯的層面,將數組分成若干小數組,然後排序
2.之後將分組的條件更改,分組跨度變小,然後再排序
3.循環往復,直到跨度降到1時,排序整個數組.
該排序因爲分組原因,相同大小的數可能順序顛倒.所以該排序方式爲不穩定排序
public static void shellSort(int[] arr) {
for(int gap=arr.length/2; gap>0; gap/=2) { /*步長逐漸減小*/
for(int i=gap; i<arr.length; i++) { /*在同一步長內*/
//同一步長內排序方式是插入排序
int temp = arr[i], j; //待排元素
//j-gap代表有序數組中最大數的下標,j-pag表示有序數組的前一個元素,減pag是減去偏移量就是步長
for(j=i; j>=gap && temp<arr[j-gap]; j-=gap)
arr[j] = arr[j-gap]; //原有序數組最大的後移一位
arr[j] = temp; //找到了合適的位置插入
}
}
}