数据结构与算法之插入排序图文详解包含例题(基于C语言)
大家好,我是小智!
什么是插入排序
插入排序是一种简单快速的排序算法,就是把一组无序的数据,以第一个数据为准,假设第一个数据是经过排序过的,把第二个数据和排好的数据进行比较,注意插入排序是从后向前进行比较,如果此时有一个新元素,则从已经排序的序列的尾部向前进行比较,如果排序过的序列的元素值大于新元素,则把新元素插入到该元素的前面。
插入排序的思路
插入排序的思路就是从右侧的未排序区域内取出一个数据,然后将它插入到已排序区域内合适的位置上。
插入排序的图文详解





插入排序的比较次数以及时间复杂度分析
在插入排序中,需要将取出的数据与其左边的数字进行比较。就跟前面讲的步骤一样,如果左边的数字更小,就不需要继续比较,本轮操作到此结束,自然也不需要交换数字的位置。
然而,如果取出的数字比左边已归位的数字都要小,就必须不停地比较大小,交换数字,直到它到达整个序列的最左边为止。具体来说,就是第 k 轮需要比较 (k - 1) 次。因此,在最糟糕的情况下,第 2 轮需要操作 1 次,第 3 轮操作 2 次……第 n 轮操作(n - 1)次,所以插入排序的最坏时间复杂度为 \(O(n^2)\),也就是当序列的元素是按照从大到小输入的情况,所以直接插入排序算法适合序列基本有序的情景。
例题
题目:设计一个程序,要求用户通过键盘依次输入10个随机且不相同的整数,然后利用插入排序实现整数序列的升序排列,使用数组实现即可。
函数实现
void InsertSort(int Buf[],int BufSize)
{
int temp = 0; //用于备份待插入元素的值
int current_prev = 0; //用于记录待插入元素的下标
//1.假设第一个元素为有序序列的元素,剩下的元素为无序序列
for (int i = 1; i < BufSize; ++i)
{
//2.备份当前待插入元素的值
temp = Buf[i];
//3.把当前待插入元素的值与有序序列中的元素依次比较,从尾部开始
for (int j = i-1; j >= 0; --j)
{
//当前待插入元素的值 小于 待插入元素的直接前驱的元素的值
if (temp < Buf[j])
{
current_prev = j; //备份当前待插入元素的直接前驱的下标
Buf[j+1] = Buf[j]; //后移
}
else
{
current_prev = j+1;
break;
}
}
//4.把待插入元素的值插入制定位置
Buf[current_prev] = temp;
}
}
插入排序的思路详解
InsertSort函数把数组划分为“已排序区”和“待插入区”,并在最开始的时候,将该数组的首元素划分为已排序区。在插入排序的过程中,对每个待插入元素先用 temp 备份,然后从已排序区末尾开始,遇到比 temp 大的元素就依次后移(Buf[j+1] = Buf[j]),直到找到第一个不大于 temp 的位置或走到数组开头,再把 temp 插入到 Buf[j+1],如此循环,最终完成整个数组的升序排列。
完整代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void InsertSort(int Buf[],int BufSize)
{
int temp = 0; //用于备份待插入元素的值
int current_prev = 0; //用于记录待插入元素的下标
//1.假设第一个元素为有序序列的元素,剩下的元素为无序序列
for (int i = 1; i < BufSize; ++i)
{
//2.备份当前待插入元素的值
temp = Buf[i];
//3.把当前待插入元素的值与有序序列中的元素依次比较,从尾部开始
for (int j = i-1; j >= 0; --j)
{
//当前待插入元素的值 小于 待插入元素的直接前驱的元素的值
if (temp < Buf[j])
{
current_prev = j; //备份当前待插入元素的直接前驱的下标
Buf[j+1] = Buf[j]; //后移
}
else
{
current_prev = j+1;
break;
}
}
//4.把待插入元素的值插入制定位置
Buf[current_prev] = temp;
}
}
int main(void)
{
int Buf[10] = {0};
int count = 0;
//1.初始化随机种子
srand(time(NULL));
//2.生成随机树
while (count < 10)
{
int RandomNum = rand() % 100;
int NumIfExist = 0;
//3.检查是否存在
for (int i = 0; i < count; i++)
{
if (Buf[i] == RandomNum)
{
NumIfExist = 1;
break;
}
}
//4.将随机数写入数组
if (!NumIfExist)
Buf[count++] = RandomNum;
}
//5.打印随机数生成是数组
printf("插入排序前的无序数组:\n");
for (int i = 0; i < count; i++)
{
printf("%2d ",Buf[i]);
}
printf("\n");
//6.进行插入排序
InsertSort(Buf,10);
//7.打印经过插入排序处理后的数组
printf("插入排序后的数组:\n");
for (int i = 0; i < count; i++)
{
printf("%2d ",Buf[i]);
}
printf("\n");
return 0;
}
运行结果


浙公网安备 33010602011771号