插入排序详解

算法思想

  把数列分成两部分,前面部分为有序区,后面部分为无序区,初始时有序区只有一个元素,一个数字组成的数列当然是有序的;

遍历无序区,把其中每个数不断地插入有序区,形成一个更大的有序区,遍历完成时整个数列也就有序了!

学习过程思想

  (1)两层 for 循环,第一层 for 循环是无序区,第二层 for 循环是有序区;

  (2)对于无序区的第 i 个元素,插入到有序区里面,使有序区元素个数逐渐递增;

  (3)有序区从第 i - 1 个元素开始,若为升序:有序区从 第 i - 1 个元素开始,逐渐往前遍历,arr[j] > arr[i],有序区元素后移:arr[j + 1] = arr[j]

  (4)有序区循环遍历完成之后,就会找到比 arr[i] 元素小的值的位置,插入第 i 个元素即可:arr[j + 1] = arr[i]

代码实践

#include <stdio.h>
#define N 10

int main() {
// 标准的输入输出不需要缓存,直接输出
setbuf(stdout, NULL);

// 初始化数组元素
int arr[N];
printf("请输入%d个数据:", N);
for (int i = 0; i < 10; ++i) {
scanf("%d", &arr[i]);
}

// 【插入排序】数组升序排列
int temp, j;
for (int i = 1; i < 10; i++) { // 无序区,需要插入第 i 个位置的无序元素
temp = arr[i];
for (j = i - 1; j >= 0 && arr[j] > temp; j--) { // 有序区,找到需要存放的第 i 个位置
arr[j + 1] = arr[j];
}
arr[j + 1] = temp;
}

printf("升序输出数组:");
for (int i = 0; i < 10; ++i) {
printf("%d ", arr[i]);
}
return 0;
}

运行结果

请输入10个数据:1 3 5 7 9 2 4 6 8 10
升序输出数组:1 2 3 4 5 6 7 8 9 10 

总结:每天进步一点点,持续学习,技能逐渐加深,自信心越来越强,坚持!

 

posted @ 2023-12-10 11:55  帅帅的编程之路  阅读(3)  评论(0编辑  收藏  举报