#include<stdio.h>
#define LEN 10
/*
希尔排序插入排序的优化
*/
int arr[LEN] = {21, 56, 4, 31, 61, 82, 15, 19, 33, 5}; //LEN=10
int d = LEN / 2;//公差
void InsertSort(int w, int A[], int len);
int main() {
while (d >= 1) {
/*按d分子表*/
for (int w = 0; w < d; w++) {//w是每个子表的第一个数的位置
int a[LEN / d];//每个子表的长度为LEN/d
for (int i = w, j = 0; i < LEN; i += d, j++) {
a[j] = arr[i];
}
InsertSort(w, a, LEN / d); //插入排序
}
d /= 2;
}
/*********输出结果***********/
for (int i = 0; i < LEN; i++) {
printf("%d ", arr[i]);
}
return 0;
}
void InsertSort(int w, int A[], int len) {//插入排序
int temp = 0;
int j = 0;
for (int i = 0; i < len; i++) {
if (A[i] < A[i - 1]) {
temp = A[i];
for (j = i - 1; j >= 0 && A[j] > temp; j--) {
A[j + 1] = A[j];
}
A[j + 1] = temp;
}
}
/*********************把排好的数放到arr的原位****************************/
for (int i = w, j = 0; i < LEN; i += d, j++) {
arr[i] = A[j];
}
}
希尔排序(更易理解的写法)
最新推荐文章于 2024-05-31 10:21:08 发布