O(n^2)时间复杂度的排序算法——插入排序

版权声明:欢迎交流学习,转载请注明出处。 https://blog.csdn.net/qq_23869697/article/details/82700986

插入排序的想法

通俗版:

从名字说起,想象我们在排队,你想插入到队伍中靠前的位置。
插入规定:保证你相邻的前面一个人同意,你才能往队伍的前一个位置挪。
在往队伍前面挪之前你得先从现在在队伍中的位置让出来,让前面的那个人可以往后移腾出一个位置给你,你才能向前。
当前面的一个人同意跟你换了,那么这个人就往后移动到你之前所在的位置;
那它的位置上就空了之后,你在队伍中的位置就向前移了一个,即这个空位置;
你再问前一个人愿不愿跟你换,如果它愿意,你就可以一直换下去,你的位置一直向前移动,直到你到了第一个位置。
如果你前面的那个人不愿意跟你换,那你只能待在当前的空位置上,所以能换的要满足两个条件:
(1)你前面那个人的同意
(2)你前面还有人

专业版:

直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。

C++实现:

C++版是很能体现排序中的每一步操作的。
下面的代码来自博主MoreWindows

void Insertsort1(int a[], int n)
{
    int i, j, k;
    for (i = 1; i < n; i++)
    {
        //为a[i]在前面的a[0...i-1]有序区间中找一个合适的位置
        for (j = i - 1; j >= 0; j--)
            if (a[j] < a[i])
                break;

        //如找到了一个合适的位置
        if (j != i - 1)
        {
            //将比a[i]大的数据向后移
            int temp = a[i];
            for (k = i - 1; k > j; k--)
                a[k + 1] = a[k];
            //将a[i]放到正确位置上
            a[k + 1] = temp;
        }
    }

改进版1 - 搜索和数据后移这二个步骤合并

void Insertsort2(int a[], int n)
{
    int i, j;
    for (i = 1; i < n; i++)
        if (a[i] < a[i - 1])
        {
            int temp = a[i];
            for (j = i - 1; j >= 0 && a[j] > temp; j--)
                a[j + 1] = a[j];
            a[j + 1] = temp;
        }
}

改进版2 - 用数据交换代替数据后移

void Insertsort3(int a[], int n)
{
    int i, j;
    for (i = 1; i < n; i++)
        for (j = i - 1; j >= 0 && a[j] > a[j + 1]; j--)
            Swap(a[j], a[j + 1]);
}

Python实现:

def insertion_sort(s):
    n = len(s)
    for i in range(1,n):                      # 从你前面的那个人问起 n = 1
        value = s[i]                        # 你
        pos = i                               # 你的位置
        while s > 0 and value < s[pos-1]: # 你不在第一个位置上,你前面的人愿意跟你换
            s[pos] = s[pos-1]             # 前一个人向后移     
            pos -= 1                          # 记下前一个值向后移后留下空位置(实际上这个位置还是原来的值)
        s[pos]=value                        # 不能换了只能停在当前的空位上

测试代码:

import random
rand_seq = [random.randint(0,20) for _ in range(20)]
insertion_sort(rand_seq)

查看1的插入情况:


STEP

在线链接: https://goo.gl/gJfNuS

猜你喜欢

转载自blog.csdn.net/qq_23869697/article/details/82700986
今日推荐