1.直接插入排序shell
直接插入排序(Insertion Sort)的基本思想是:每次將一個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子序列中的適當位置,直到所有記錄插入完成爲止。數組
設數組爲a[0…n-1]。ide
1. 初始時,a[0]自成1個有序區,無序區爲a[1..n-1]。令i=1spa
2. 將a[i]併入當前的有序區a[0…i-1]中造成a[0…i]的有序區間。blog
3. i++並重復第二步直到i==n-1。排序完成。排序
代碼以下:it
void InsertSort(int* a, size_t n) //直接插入排序 { assert(a); for (int i = 1; i < n; ++i) { int tmp = a[i]; int j = i - 1; while (j >= 0 && a[j] > tmp) { a[j + 1] = a[j]; --j; } a[j + 1] = tmp; } }
2.希爾排序io
該方法的基本思想是:先將整個待排元素序列分割成若干個子序列(由相隔某個「增量」的元素組成的)分別進行直接插入排序,而後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。由於直接插入排序在元素基本有序的狀況下(接近最好狀況),效率是很高的,所以希爾排序在時間效率上比前兩種方法有較大提升。class
void shellsort2(int a[], int n) { int j, gap; for (gap = n / 2; gap > 0; gap /= 2) for (j = gap; j < n; j++)//從數組第gap個元素開始 if (a[j] < a[j - gap])//每一個元素與本身組內的數據進行直接插入排序 { int temp = a[j]; int k = j - gap; while (k >= 0 && a[k] > temp) { a[k + gap] = a[k]; k -= gap; } a[k + gap] = temp; } }