把n個待排的元素看成一個有序表和一個無序表,開始時,有序表只包含1
個元素,無序表中有n - 1
個元素。排序過程中每次從無序表中取出第一個元素,把它的排序碼依次與有序表元素的排序碼比較,將它插入適當?shù)奈恢?,使之成為新的有序表?/p>
1. 案例:
假如現(xiàn)有待排序列如下(帶 * 號的是有序表元素):
17* 3 25 14 20 9
那么開始的時候,17
就是有序表,剩余元素是一個無序表。
3* 17* 25 14 20 9
3* 17* 25* 14 20 9
3* 14* 17* 25* 20 9
3* 14* 17* 20* 25* 9
3* 9* 14* 17* 20* 25*
代碼中有詳細的注釋:
public static void sort(int[] arr) {
if (arr == null || arr.length == 1) {
return;
}
for(int i=1; i<arr.length; i++) { // 默認第一個是有序表,從第二個元素開始進行插入排序
int insertVal = arr[i]; // 待排元素
int insertIndex = i - 1; // 從有序表最后一個元素開始比較
while (insertIndex >= 0 && insertVal < arr[insertIndex]) { // 如果還沒有將有序表比較完 && 待排元素還沒找到位置
arr[insertIndex + 1] = arr[insertIndex]; // 比待排元素大的元素后移一位
insertIndex --; // 繼續(xù)往前比較
}
// 找到位置后,其他元素都后移了,自己占坑
if (insertIndex + 1 != i) {
arr[insertIndex + 1] = insertVal;
}
}
}
假如現(xiàn)在有如下序列:
16, 23, 12, 8, 1
要求按照從小到大的順序排列,你會發(fā)現(xiàn),最小的1在最后面,第二小的8在倒數(shù)第二個位置,那么在排序的時候,就會發(fā)生很多次交換,即while循環(huán)里面的代碼會執(zhí)行很多次,1在排序的時候就會執(zhí)行四次,這樣性能就下降了。有沒有優(yōu)化的空間呢?有,那就是希爾排序……敬請期待