谁能帮我解释下shell排序法啊?
来源:学生作业帮 编辑:百度作业网作业帮 分类:综合作业 时间:2024/08/19 00:16:25
谁能帮我解释下shell排序法啊?
不太明白,求人帮解释,不甚感激.
不太明白,求人帮解释,不甚感激.
![谁能帮我解释下shell排序法啊?](/uploads/image/z/17078505-33-5.jpg?t=%E8%B0%81%E8%83%BD%E5%B8%AE%E6%88%91%E8%A7%A3%E9%87%8A%E4%B8%8Bshell%E6%8E%92%E5%BA%8F%E6%B3%95%E5%95%8A%3F)
#include
#include
#include
#define MAXlen 100
/*
算法思想简单描述:先将要排序的一组数按某个增量 d分成若干组,每组中记录的下
标相差 d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组
中再进行排序.当增量减到 1时,整个要排序的数被分成一组,排序完成.下面的函
数是一个希尔排序算法的一个实现,初次取序列的一半为增量,以后每次减半,直到
增量为 1,希尔排序是不稳定的.
*/
void shell_sort(int *x, int n) { // 希尔排序
int h, j, k, t;
for (h = n / 2; h > 0; h = h / 2) { /*控制增量*/
for (j = h; j < n; j++) {
t = *(x + j);
for (k = j - h; (k >= 0 && t < *(x + k)); k -= h) {
*(x + k + h) = *(x + k);
}
*(x + k + h) = t;
}
}
}
int main() {
int i;
int iArr[MAXlen];
srand((unsigned int)time(NULL));
printf("\n排序前:\n");
for(i = 0 ; i < MAXlen ; i++) {
iArr[i] = (unsigned int)rand() % 1000;
if(i % 10 == 0) printf("%\n");
printf("%5d",iArr[i]);
}
printf("\n");
shell_sort(iArr,MAXlen);
printf("\n排序后:\n");
for(i = 0 ; i < MAXlen ; i++) {
if(i % 10 == 0) printf("%\n");
printf("%5d",iArr[i]);
}
printf("\n\n");
return 0;
}
#include
#include
#define MAXlen 100
/*
算法思想简单描述:先将要排序的一组数按某个增量 d分成若干组,每组中记录的下
标相差 d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组
中再进行排序.当增量减到 1时,整个要排序的数被分成一组,排序完成.下面的函
数是一个希尔排序算法的一个实现,初次取序列的一半为增量,以后每次减半,直到
增量为 1,希尔排序是不稳定的.
*/
void shell_sort(int *x, int n) { // 希尔排序
int h, j, k, t;
for (h = n / 2; h > 0; h = h / 2) { /*控制增量*/
for (j = h; j < n; j++) {
t = *(x + j);
for (k = j - h; (k >= 0 && t < *(x + k)); k -= h) {
*(x + k + h) = *(x + k);
}
*(x + k + h) = t;
}
}
}
int main() {
int i;
int iArr[MAXlen];
srand((unsigned int)time(NULL));
printf("\n排序前:\n");
for(i = 0 ; i < MAXlen ; i++) {
iArr[i] = (unsigned int)rand() % 1000;
if(i % 10 == 0) printf("%\n");
printf("%5d",iArr[i]);
}
printf("\n");
shell_sort(iArr,MAXlen);
printf("\n排序后:\n");
for(i = 0 ; i < MAXlen ; i++) {
if(i % 10 == 0) printf("%\n");
printf("%5d",iArr[i]);
}
printf("\n\n");
return 0;
}