經典排序算法----直接插入排序算法及其改進(穩定)
定義:
直接插入排序的基本操作是將一個記錄插入到已經排好序的有序表中,從而得到一個新的,記錄數加一的有序表。
實現思想
我們預留了一個哨兵,這里我們將用到它來保存一個臨時值
插入排序是在一個已經有序的小序列的基礎上,一次插入一個元素。當然,剛開始這個有序的小序列只有1個元素,就是第一個元素。比較是從有序序列的末尾開始,也就是想要插入的元素和已經有序的最大者開始比起,如果比它大則直接插入在其后面,否則一直往前找直到找到它該插入的位置。如果碰見一個和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。
所以,相等元素的前后順序沒有改變,從原無序序列出去的順序就是排好序后的順序,所以插入排序是穩定的。
基本思想
每次將一個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子序列中的適當位置,直到全部記錄插入完成為止。
代碼實現
void InsertSort(SqList *L) { int i, j, count1, count2; count2 = count1 = 0; for (i = 2; i <= L->length;i++) { if (L->r[i]<L->r[i-1]) //若是前面第一個都不滿足順序,那么我們就要去循環 { L->r[0] = L->r[i]; for (j = i - 1; L->r[j]>L->r[0]; j--) //將大的數據全部向后移動,從后向前防止數據覆蓋 { count1++; L->r[j + 1] = L->r[j]; //記錄后移 } L->r[j + 1] = L->r[0]; //插入到正確位置 count2++; } } printf("loop move count:%d, swap insert count:%d\n", count1, count2); }
性能分析
空間上只需要一個記錄輔助空間,所以關鍵看時間復雜度 平均比較和移動次數約為(n^2)/4,所以時間復雜度為O(n^2)。 其性能要比冒泡和簡單選擇排序好些