八大排序算法(三) Shell排序
代码:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define SIZE 10
int n[SIZE];
void init(int n[], int len){
int i;
srand((unsigned)time(NULL));
for (i=0; i<len; i++){
n[i] = rand()%10+1;
}
}
void printout(int n[], int len){
int i;
for (i=0; i<len; i++){
printf("%d ", n[i]);
}
printf("\n");
}
void ShellSort(int n[], int len, int s){
// n 要进行排充的数组
// len 数组的长度
// s 每次要递增的长度
int i, j ,k;
int tmp;
for (k=s; k>0; k>>=1){
// 分组排序, 每个数字都要用到
for (i=k; i<len; i++){
tmp = n[i]; // tmp 为 n[i]
j = i-k; // j 为此段第一个首次的位置
/* 组内排序, 将 temp 直接插入组合内合适的记录位置
并不断地向前进行,向前插入
*/
while (j>=0 && tmp < n[j]){
n[j+k] = n[j];
j -= k;
}
n[j+k] = tmp;
}
}
}
int main(){
init(n, SIZE);
printout(n, SIZE);
ShellSort(n, SIZE, 4);
printout(n, SIZE);
return 0;
}
运行图: