参考视频
直接插入排序代码(C/C++实现) 细到爆炸!_哔哩哔哩_bilibili
直接插入排序代码(C/C++实现) 细到爆炸!_哔哩哔哩_bilibili
核心思想:
将有序部分的最后一个和无序数组的第一个比较,如果下于则插入到合适的位置;如果大于,则扩充有序数组
6-12 直接插入排序
分数 20
作者 启迪-数据结构教研组
单位 广西科技大学
利用直接插入排序算法,将顺序表L中的元素从小到大进行排序。
函数接口定义:
void InsertionSort(List L);
其中 List 结构定义为:
struct LNode{
int Data[MAXSIZE]; //Data为待排序序列数组
int Last; //Last为最后一个元素的数组下标
};
typedef struct LNode *List;
裁判测试程序样例:
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 1000
struct LNode{
int Data[MAXSIZE]; //Data为待排序序列数组
int Last; //Last为最后一个元素的数组下标
};
typedef struct LNode *List;
void InsertionSort(List L);
List Create()
{
List L;
L = (List)malloc(sizeof(struct LNode));
int j = 0,ch;
/*输入待排序序列,输入 ctrl+Z 结束*/
while(scanf("%d",&ch)!=EOF)
{
L->Data[j] = ch;
j++;
}
L->Last = j-1;
return L;
}
int main()
{
int i;
List L = Create();
InsertionSort(L);
for(i=0;i<=L->Last;i++)
printf("%d ",L->Data[i]);
return 0;
}
/* 请在这里填写答案 */
输入样例:
99 66 45 33 37 10 22 13
输出样例:
10 13 22 33 37 45 66 99
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
C (gcc)
void InsertionSort(List L) {
int i, j, temp;
// 外层循环:无序区间的起始位置 i,从 1 开始(第一个元素默认有序)
for (i = 1; i <= L->Last; i++) {
// 取出无序区间的第一个元素
temp = L->Data[i];
// 初始化 j 为有序区间最后一个元素的下标
j = i - 1;
// 改用 do-while 循环实现元素后移
if (j >= 0) { // 先判断 j 不越界,避免 do-while 直接执行导致数组越界
do {
// 元素后移,为 temp 腾出位置
L->Data[j + 1] = L->Data[j];
j--; // 向前移动指针,继续比较
} while (j >= 0 && L->Data[j] > temp); // 满足条件则继续循环
}
// 将 temp 插入到正确位置
L->Data[j + 1] = temp;
}
}
手写笔记理解代码
