排序算法——插入排序

转载: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 ;也可
        }
    }

 

posted @ 2012-10-08 16:29  三块钱的其其  阅读(135)  评论(0编辑  收藏  举报