在前面的几篇博客中,我们已经简单地探讨过冒泡排序、选择排序和快速排序了,今天,让我们来聊聊插入排序insertSort。
插入排序,顾名思义,就是在合适的地方插入元素,使得数组由小到大(由大到小)排列。
代码实现如下:
void InsertSort(int a[],int count) {
int i,j;
for(i = 1;i < count; i ++) //第一次循环将0-1作为“有序区,使得a[0]和a[1]按从小到大的顺序排列
{ //之后每次循环将”有序区“向后扩展一位
int j = i - 1;
int base = a[i]; //保存内循环开始之前a[i]的初值,默认它为”有序区中的最大值
while(j >= 0 && a[j] > base){ //注意,上一行有必要,因为内循环如果执行,a[i]的值会发生改变
a[j+1] = a[j]; //如果a[i]的前一个元素大于a[i],则将前一个元素放到a[i]的位置
j--;
}
a[j+1] = base; //将a[i]放到“有序区”中正确的位置
}
}
- 注意:
1.外循环从i = 0或i = 1开始,设置“有序区”,使得下标小于等于i的元素从小到大(从大到小)依次排列(其实从如果从0开始,则在该次外循环中,内循环无法被执行,因为j = i -1 < 0,所以我们一般设置外循环从1开始)。
2.base = a[i]这个语句必须在内循环开始执行之前被定义,作用是将a[i]的初值保留下来。在定义base变量作为“有序区”的最大值后,根据条件执行内循环。如果内循环执行,则a[i]中的值会被原先的a[j]覆盖,所以实现要设置一个变量base来保存a[i]的初值。
3.“有序区”的元素已经是由小到大(由大到小)排列了,如果a[j]小于base,则a[j]之前的元素都小于base(因为它们都小于a[j])。
4.插入排序的思想是先构建一个”有序区“,然后把后面的元素一个个”插入“到”有序区“中正确的位置,使得每一次外循环执行过后,”有序区“的元素都按照从小到大(从大到小)的顺序排列。
利用srand()和rand()函数生成一组随机数(不了解的同学可以看看我之前的一篇博客C/C++中的srand()和rand()随机数函数),然后调用文章开头的InsertSort函数将储存在数组中的随机数进行排序,得到:
请输入数组长度:9
第0个数为:30
第1个数为:0
第2个数为:25
第3个数为:1
第4个数为:3
第5个数为:29
第6个数为:5
第7个数为:9
第8个数为:6
排序后的数组为:
第0个数为:0
第1个数为:1
第2个数为:3
第3个数为:5
第4个数为:6
第5个数为:9
第6个数为:25
第7个数为:29
第8个数为:30
以上就是这篇关于插入排序的博客的主要内容了,大家可以点赞+关注哦~