算法思想
把数列分成两部分,前面部分为有序区,后面部分为无序区,初始时有序区只有一个元素,一个数字组成的数列当然是有序的;
遍历无序区,把其中每个数不断地插入有序区,形成一个更大的有序区,遍历完成时整个数列也就有序了!
学习过程思想
(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
总结:每天进步一点点,持续学习,技能逐渐加深,自信心越来越强,坚持!
标签:10,arr,int,插入排序,元素,详解,有序,升序 From: https://www.cnblogs.com/michael-study/p/17892346.html