原题链接:[编程入门]数组插入处理
直接插入排序
#include <stdio.h>
int main() {
int a[10], key;
// 输入已排序的数组
for (int i = 0; i < 9; i++) {
scanf("%d", &a[i]);
}
// 输入需要插入的数字
scanf("%d", &key);
//直接插入排序
int k=8;
while(k>=0&&a[k]>key){
a[k+1]=a[k];
k--;
}
a[k+1]=key;
// 输出排序后的数列
for (int i = 0; i < 10; i++) {
printf("%d\n", a[i]);
}
return 0;
}折半插入排序
#include <stdio.h>
int main() {
int a[10], key, mid, l;
// 输入已排序的数组
for (int i = 0; i < 9; i++) {
scanf("%d", &a[i]);
}
// 输入需要插入的数字
scanf("%d", &key);
// 折半插入排序
int low = 0, high = 8;
while (low <= high) {
mid = (low + high) / 2;
if (key < a[mid]) {
high = mid - 1;
} else {
low = mid + 1;
}
}
// 移动元素
for (l = 8; l >= low; --l) {
a[l + 1] = a[l];
}
// 插入新元素
a[l + 1] = key;
// 输出排序后的数列
for (int i = 0; i < 10; i++) {
printf("%d\n", a[i]);
}
return 0;
}希尔排序
希尔排序是插入排序的一种改进算法,它的主要思想是通过将数组分为若干个子序列来减小逆序对的数量。这些子序列分别进行插入排序,然后逐渐减小序列的长度,最终达到整体有序的效果。
具体步骤如下:
选择增量序列: 选择一个增量序列,通常是通过一定规则递减的。在上述程序中,使用的是 n/2、n/4、...、1 的递减序列。
对每个子序列进行插入排序: 以当前增量作为步长,对数组中的每个子序列进行插入排序。这里的子序列是以当前增量为间隔的元素构成的。
逐渐缩小增量: 重复上述步骤,逐渐减小增量,直至增量为1。
#include <stdio.h>
// 希尔排序函数
void shellSort(int arr[], int n) {
for (int gap = n / 2; gap > 0; gap /= 2) {
for (int i = gap; i < n; i++) {
int temp = arr[i];
int j;
for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {
arr[j] = arr[j - gap];
}
arr[j] = temp;
}
}
}
int main() {
int a[10], key;
// 输入已排序的数组
for (int i = 0; i < 9; i++) {
scanf("%d", &a[i]);
}
// 输入需要插入的数字
scanf("%d", &key);
// 将新数字插入到已排序数组中
a[9] = key;
// 使用希尔排序对数组进行排序
shellSort(a, 10);
// 输出排序后的数列
for (int i = 0; i < 10; i++) {
printf("%d\n", a[i]);
}
return 0;
}0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复