排序算法——插入排序
转载:http://www.cnblogs.com/luxiaoxun/archive/2012/09/01/2666677.html
插入排序的基本思想是,经过i-1遍处理后,L[1..i-1]己排好序。第i遍处理仅将L[i]插入L[1..i-1]的适当位置,使得L[1..i]又是排好序的序列。要达到这个目的,我们可以用顺序比较的方法。首先比较L[i]和L[i-1],如果L[i-1]<=L[i],则L[1..i]已排好序,第i遍处理就结束了;否则交换L[i]与L[i-1]的位置,继续比较L[i-1]和L[i-2],直到找到某一个位置j(1<=j<=i-1),使得L[j] <=L[j+1]时为止。
直接插入排序是稳定的。算法时间复杂度是O(n^2)。
http://dxjsjjc.sut.edu.cn/zsdys/flash/a8.swf
//插入排序 void InsertSort(int a[], int n) { int i, j; int temp; for (i = 1; i < n; i++) { temp = a[i]; j = i -1; while(j >= 0 && a[j] > temp) { a[j+1] = a[j]; --j; } a[j+1] = temp; } } //递归的插入排序 void RecursiveInsertSort(int a[], int n) { int i, key; if(n > 1) { RecursiveInsertSort(a,n-1); } key = a[n-1]; i = n-2; while(i >= 0 && a[i] > key) { a[i+1] = a[i]; i--; } a[i+1] = key; } //折半插入排序 void BinarySearchInsertion(int numbers[], int n) { int middle = 0; for (int i = 1; i < n; i++) { int low = 0; int high = i - 1; int temp = numbers[i]; while (low <= high) { middle = (low + high) / 2; if (temp == numbers[middle]) break; else if(temp < numbers[middle]) high = middle - 1; else low = middle + 1; } for (int k = i; k > middle; k--) numbers[k] = numbers[k - 1]; numbers[low] = temp; // 此处用 numbers[high+1] = temp ;也可 } }