C语言实现希尔排序
文章目录
- C语言实现希尔排序
- 希尔排序算法
- 项目完整代码
- 运行效果图
希尔排序算法
//希尔排序算法
void ShellSort(int arr[], int len) {
int d, i, j;
//arr[0]只是暂存单元,不是哨兵,当j<=0时,表示到达插入位置
for (d = len / 2;
d >= 1;
d /= 2) {//步长变化,每次取一半
for (i = d + 1;
i <= len;
++i) {//从每个子表的第二个元素开始进行直接插入排序
if (arr[i] < arr[i - d]) {//将arr[i]插入有序增量表
arr[0] = arr[i];
//将arr[i]暂存在arr[0]中
for (j = i - d;
j > 0 && arr[0] < arr[j];
j -= d)
arr[j + d] = arr[j];
//记录后移,查找插入位置
arr[j + d] = arr[0];
//插入
}
}
}
}
项目完整代码
//插入排序————希尔排序(不稳定,空间复杂度为O(1),最坏时间复杂度为O(n^2))
#include
#include //希尔排序算法
void ShellSort(int arr[], int len) {
int d, i, j;
//arr[0]只是暂存单元,不是哨兵,当j<=0时,表示到达插入位置
for (d = len / 2;
d >= 1;
d /= 2) {//步长变化,每次取一半
for (i = d + 1;
i <= len;
++i) {//从每个子表的第二个元素开始进行直接插入排序
if (arr[i] < arr[i - d]) {//将arr[i]插入有序增量表
arr[0] = arr[i];
//将arr[i]暂存在arr[0]中
for (j = i - d;
j > 0 && arr[0] < arr[j];
j -= d)
arr[j + d] = arr[j];
//记录后移,查找插入位置
arr[j + d] = arr[0];
//插入
}
}
}
}int main() {
//数组中第0号位置的值不是有效值!
int arr[] = {0, 49, 38, 65, 97, 76, 13, 27, 49};
int len = sizeof(arr) / sizeof(int);
//希尔排序
ShellSort(arr, len);
//将已排序的结果逐个输出
printf("希尔排序结果为:");
for (int i = 1;
i < len;
++i) {
printf("%d ", arr[i]);
}
return 0;
}
运行效果图
int arr[] = {0, 49, 38, 65, 97, 76, 13, 27, 49};
文章图片
推荐阅读
- 手撕常用排序算法|希尔排序——C语言实现
- C++|希尔排序——C++实现
- 数据结构|希尔排序——直插排序的更好优化
- 植物大战数据结构|植物大战 希尔 排序 ——纯C
- 20172328《程序设计与数据结构》实验四Android程序设计报告
- 数据结构|线性表练习之Example040-删除单链表中数据域绝对值相等节点,仅保留第一次出现的节点而删除其余绝对值相等的节点
- 数据结构|线性表练习之Example018-删除单链表中所有值为 x 的节点
- JAVA|java-单链表反转解法及分析
- 数据结构与算法|数据结构(第四章)