//插入排序02
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#define InitiaSize 10
int* Arr; //定义增量序列
typedef struct{
int* data;
int len;
int MaxSize;
}SqList;
bool InitiaList(SqList &L){
int len;
printf("请输入线性表的长度:");
scanf("%d",&len);
while( len < 0){
printf("输入长度不规范,请重新输入!\n");
scanf("%d",&len);
}
if(len < InitiaSize){
L.data = (int*)malloc(sizeof(int)*InitiaSize);
L.len = len;
L.MaxSize = InitiaSize;
}
else{
L.data = (int*)malloc(sizeof(int)*(len + 1));
L.len = len;
L.MaxSize = len + 1;
}
printf("初始化完毕!\n");
if((L.len == 0)||(L.MaxSize == 0)){
printf("此线性表为空,无法进行随机赋值!\n");
return false;
}
int i;
srand(time(NULL));
for(i = 1; i <= L.len; i++){
L.data[i] = rand()%100;
}
printf("随机赋值完毕!\n");
return true;
}
bool PrintList(SqList &L){
if((L.len == 0)||(L.MaxSize == 0)){
printf("此线性表为空,无法进行输出操作!\n");
return false;
}
int i;
for(i = 1; i <= L.len; i++){
if(i == L.len){
printf("%d\n",L.data[i]);
}
else{
printf("%d ",L.data[i]);
}
}
printf("此线性表输出完毕!长度是%d,最大容量是%d!\n",L.len,L.MaxSize);
return true;
}
//希尔排序 快速排序的升级版 就多了一个增量序列
void ShellSort(SqList &L){
if((L.len == 0)||(L.MaxSize == 0)){
printf("此线性表长度为空,无法进行希尔排序!\n");
return ;
}
printf("请输入你想要创建的增量序列的长度:");
int Alen;
scanf("%d",&Alen);
while(Alen < 1){
printf("您输入的长度不规范,请重新输入!\n");
scanf("%d",&Alen);
}
Arr = (int*)malloc(sizeof(int)*Alen);
int i;
for(i = 0; i < Alen; i++){
Arr[i] = pow(2, Alen - i) - 1;
}
for(i = 0; i < Alen; i++){
if(i == Alen - 1){
printf("%d\n",Arr[i]);
}
else{
printf("%d ",Arr[i]);
}
}
printf("增量序列创建完毕!\n");
printf("即将进入希尔排序!\n");
int k, j;
for(k = 0; k < Alen; k++){
for(i = 1 + Arr[k]; i <= L.len; i++){
if(L.data[i - Arr[k]] > L.data[i]){
L.data[0] = L.data[i];
j = i - Arr[k];
while((j > 0)&&(L.data[j] > L.data[0])){
L.data[j + Arr[k]] = L.data[j];
j -= Arr[k];
}
L.data[j + Arr[k]] = L.data[0];
}
}
}
printf("希尔排序执行完毕!\n");
}
int main(){
SqList L;
InitiaList(L);
PrintList(L);
clock_t T;
T = clock(); //记录插入排序花费的时间
ShellSort(L); //进行希尔排序
T = clock();
PrintList(L);
printf("此次排序共耗时%lf s\n",((float)T)/CLOCKS_PER_SEC);
return 0;
}
/*
希尔排序不稳定而且算法复杂度也比较高
还需要注意的是:希尔排序的增量序列数
最好都互为质数,并且希尔排序仅适用于
顺序表,链表不适合应用希尔排序
*/