直接排序是比较简单的一种排序方法,它排序的原理如下:
如果有一组数据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] |
通过上面的分析可以知道,当前后两个数相等时插入排序是不对其进行交换,如此可知道它是一个稳定的排序算法。 |