算法学习之希尔排序:
希尔排序是在插入排序的基础之上,优化了时间效率而开发出来的排序算法,其讲普通直接插入排序的O(n*n)的时间复杂度降为了O(nlogn)的时间复杂度,是第一个打破n*n时间复杂度的算法。因此我们有必要好好学习一下这个算法,掌握它的思想。
主要思想:
希尔排序算法通过间隔值划分,将待排序数组分为了几个逻辑上的序列,如下:
间距值为k,待排序数组为A[n],通过间隔值,将数组分为
A[1] A[1+k] A[1+2k] ...
A[2] A[2+k] A[2+2k] ...
...
A[k] A[2k] A[3k] ...
其中间距值是变化的,一般取n/2,n/4,n/8,...
当每取一个间距值时,就会生成k个逻辑上的序列,而算法的主要目的就是将待排序数组分为几个逻辑序列后,再对每一个逻辑上的序列进行一次直接插入排序。
这样做,可以使得整个待排序序列趋向于已排好序的序列,而我们知道已拍好序的序列排序时间复杂度为n。因此希尔排序实质上是从宏观上对待排序数组进行调整,对每个组进行直接插入排序,从而达到使得数组趋向于已拍好序的数组来达到提高时间效率的目的。
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int A[20];
int main(){
srand((unsigned)(time(NULL))); //设置随机数种子
for(int i = 0; i < 20;i++){
A[i] = rand() % 100;
}
int k, j, i;
k = 20 / 2;
while(k > 0){
for(i = k; i < 20;i++){
int tem = A[i];
for(j = i-k;j >= 0 && A[j] > tem; j-=k)A[j+k] = A[j];
A[j+k] = tem;
}
k /= 2;
}
for(int i = 0;i < 20;i++){
printf("%d ",A[i]);
}
return 0;
}