码迷,mamicode.com
首页 > 编程语言 > 详细

插入排序

时间:2016-04-05 14:17:24      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:记录   插入   排序   元素   希尔   

    直接插入排序(Straight Insertion Sort)是一种最简单的排序方法,他的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的,记录数增1的有序表。


当前元素的前面元素均为有序,要插入时,从当前元素的左边开始往前找从后往前找),比当前元素大的元素均往右移一个位置,最后把当前元素放在他应该在的位置就行了。


比如对1 3 2 4 0 进行排序 (i 为要进行插入有序数列的数字下标值)过程如下:

技术分享

代码实现如下:

//直接插入排序
void Insert_Sort(int* a, size_t size)
{
    assert(a);
    
    for (int i = 1; i < size; i++) //第一个数肯定是有序的,从第二个位置开始遍历
    {
        int j = 0;
        int tmp = a[i];
        
        //前i-1个数已经是有序的,所以当a[j] > tmp时,只要将a[j]向后移动一位
        for (j = i - 1; j >= 0 && tmp < a[j]; j--) 
        {
            a[j + 1] = a[j];
        }
        
        a[j + 1] = tmp;
    }
}

测试:

void TestInsertSort()
{
    int a[5] = { 1, 3, 2, 4, 0 };
    Print(a, 5);
    cout << endl;
    Insert_Sort(a, 5);
    Print(a, 5);
    cout << endl;

}

 

    希尔排序Shell‘s Sort)又称“缩小增量排序”,他也是一种插入排序类的方法,但在时间效率上较直接插入排序有较大的改进。

   增量的选择: 本文采用增量为(n/3)+1,依次递推,每次增量为原先的(n/3)+1,直到增量为1;

比如对

49, 38, 65, 97, 76, 13, 27, 49, 55, 4

进行排序:过程如下

技术分享

技术分享

技术分享

代码实现如下:

void Shell_Sort(int* a, size_t size)
{
    assert(a);

    int gap = size;
    while (gap > 1)
    {
        gap = (gap / 3) + 1;
        for (int i = gap; i < size; i++)
        {
            int index = i;
            int tmp = a[index];
            int end = index - gap;

            while (end >= 0 && tmp < a[end])
            {
                a[end + gap] = a[end];
                end -= gap;
            }
            a[end + gap] = tmp;
        }
    }
}

测试:

void TestShell_Sort()
{
    int a[10] = { 49, 38, 65, 97, 76, 13, 27, 49, 55, 4 };
    Print(a, 10);
    cout << endl;

    Shell_Sort(a, 10);
    Print(a, 10);
    cout << endl;
}


本文出自 “木木侠” 博客,谢绝转载!

插入排序

标签:记录   插入   排序   元素   希尔   

原文地址:http://10324228.blog.51cto.com/10314228/1760362

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!