/*算法過程: 從大小爲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; }
運行結果:ios