希尔排序
希尔排序的本质还是直接插入排序
影响直接插入排序速度的两个因素:
- 是否基本有序
- 序列长度
我们发现基本有序且长度较短的速度更快。
所以希尔排序选择由大到小的不同增量使原序列满足这两个特点。
#include"../init.h"
void ShellInsert(RedType node[], int dk);
//希尔排序
//dlta[]是增量数组
void ShellSort(RedType node[], int dlta[], int len){
//len 是dlta[]数组的长度
int k = 0;
for(; k< len; k++){
ShellInsert(node,dlta[k]);
}
}
/*eg:
int d[] = {4,2,1};
ShellSort(L.r,d,sizeof(d)/sizeof(int));
*/
//增量为dk的排序
void ShellInsert(RedType node[], int dk){
RedType media;
int i,j;
for(i=dk; i < MAXSIZE; i++){
if(node[i].key < node[i-1].key){
media = node[i];
for(j=i-dk; j>=0 && node[j].key > media.key; j-=dk){
node[j+dk] = node[j];
}
node[j+dk] = media;
}
}
}
int main(){
Sqlist L;
int d[] = {4,2,1};
init(L.r);
ShellSort(L.r,d,sizeof(d)/sizeof(int));
show(L.r);
}