直接插入排序

         直接排序是比较简单的一种排序方法,它排序的原理如下:

         如果有一组数据R[1…n],将这组数据分成二部分,一部分是已经排序过的数据,另一部分是未排序过。每次读无序区的第一个数据然后跟有序区的最后一个数据进行比较,比如说是按递增的话,那么无序的数小于有序的数,那么就将其保存在R[0]当中,然后不断的将有序区的数据往后移动,直到找到比他小的数。

void InsertSort(SeqList &R, int n)

{

    int i, j;

    for (i = 2; i <= n; i++)//扫描所有的数据

    {

        if (R[i].key < R[i - 1].key)//如果当前无序的第一个数比有序的最后一个数要大

        {

            R[0] = R[i];//将当前的无序数为哨兵

            for (j = i - 1; R[0].key<R[j].key; j--)//遍历有序区,直到找到比无序数要大为止

                R[j + 1] = R[j];//如果没有找到那个数就一直向后移动一位

            R[j + 1] = R[0];//将无序数放在特定的位置上

        }

    }

}

排序过程

初始关键字

[50] [37 80 42 12 23 83 84 96 82]

I=2

R[0].key=37

[37 50][80 42 12 23 83 84 96 82]

I=3

80

[37 50 80][42 12 23 83 84 96 82]

I=4

42

[37 42 50 80][12 23 83 84 96 82]

I=5

12

[12 37 42 50 80][23 83 84 96 82]

I=6

23

[12 23 37 42 50 80][83 84 96 82]

I=7

83

[12 23 37 42 50 80 83][84 96 82]

I=8

84

[12 23 37 42 50 80 83 84][96 82]

I=9

96

[12 23 37 42 50 80 83 84 96][82]

I=10

82

[12 23 37 42 50 80 82 83 84 96]

通过上面的分析可以知道,当前后两个数相等时插入排序是不对其进行交换,如此可知道它是一个稳定的排序算法。

原文地址:https://www.cnblogs.com/tianyake/p/3668437.html