/*算法过程: 从大小为1的子数组A[1]开始,根据A[2]比A[1]小或大,将A[2]插入到A[1]的前面或后面。 在第i次执行中,要将A[i]插入到已排序的子数组A[1...i-1]中的合适位置上,其进行过程: 依次扫描序号从i-1到1的元素,每次都将A[i]和当前位置的元素比较。在扫描的每一步,元素都被移到序号更高的一个位置, 这种执行比较和移位的扫描过程直到以下情况出现时为止:或者找到一个小于等于A[i]的元素,或者前面已排序数组的元素都已扫描过。 在这种情况下,A[i]已被插到合适的位置,插入A[i]的过程就完成了。 */ /* 输入:n个元素的数组A[1..n] 输出:按非降序排列的数组A[1...n] for i <- 2 to n x <- A[i] j <- i-1 while (j > 0) and (A[j] > x) A[j+1] <- A[j] j <- j-1 end while A[j+1] <- x end for */ #include<iostream> using namespace std; /* void swap(int &a, int &b) { int temp = a; a = b; b = temp; } */ void insertSort(int *A, int n) { int key; for (int i = 1; i < n; i++) //控制循环次数 { key = A[i]; //待排序的第一个元素 int j = i - 1; //已排序的元素的最后一个索引数 while(j >= 0 && key < A[j]) { A[j+1] = A[j]; j--; } A[j+1] = key; //找到了合适的位置就赋值在j索引后面 /*简洁版本 for (int j = i - 1; j >= 0 && A[j+1] < A[j]; j--) swap(A[j], A[j+1]); */ /*测试 cout << "第" << i <<"趟排序: "; for (int l = 0; l < n; l++) cout << A[l] << " "; cout << endl; */ } } int main() { //int A[10] = {20,3,6,1,87,46,12,5,2,11}; int A[5] = {20,3,6,1,87}; cout << "before sort: "; for (int i = 0; i < 5; i++) cout << A[i] << " "; cout << endl; insertSort(A, 5); cout << "after sort: "; for (int j = 0; j < 5; j++) { cout << A[j] << " "; } cout << endl; return 0; }
运行结果: