插入排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了插入排序相关的知识,希望对你有一定的参考价值。

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


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

以上是关于插入排序的主要内容,如果未能解决你的问题,请参考以下文章

KDoc:插入代码片段

代码片段使用复杂的 JavaScript 在 UIWebView 中插入 HTML?

将代码片段插入数据库并在 textarea 中以相同方式显示

关于在各浏览器中插入音频文件的html代码片段

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段