插入排序--C++

/*算法過程:
    從大小爲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

相關文章
相關標籤/搜索