插入排序--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;
}

运行结果:

原文地址:https://www.cnblogs.com/harbin-ho/p/12659625.html