3、希尔排序算法: 希尔排序算法的平均时间复杂度较低,算法的原理如下: 原理:算法在运行的过程中,每次将前面的数据与其间隔stride步长位置的数据进行对比,完成当前stride的全部对比之后,将stride缩小为原来的一半,以此类推,最后stride为1,这个时候对比的就是相邻的元素,对比完成,序列同时完成了排序。 时间复杂度:O(n*log(n)) API_0实现如下(常规的希尔序列初始增量:N/2. N为数据的长度): int ShellSort(int *In, int N)
{
int i, j, stride,Temp;
/* 这里需要注意的是,stride最终的结果为0:当stride=1时,stride/=2得到的stride=floor(0.5)=0,所以循环退出 */
for (stride = N / 2; stride > 0; stride /= 2) {
for (i = stride; i < N; i++) {
Temp = In[i];
for (j = i; j >= stride && Temp < In[j - stride] ; j -= stride) {
In[j] = In[j - stride];
}
In[j] = Temp;
}
}
return 1;
}
API_1实现如下(希尔Hibbard增量序列:Hibbard:{1, 3, ..., 2^k-1}) 注:这是一种冲破二次时间屏障的算法 int ShellSort_Hibbard(int *In, int N) // 时间复杂度最坏的情况为o(N^3/2)
{
int i, j, stride, Temp;
int k = log2(N / 2 + 1);
// printf("The k is:%d\n", k);
/* 这里需要注意的是,stride最终的结果为0:当stride=1时,stride/=2得到的stride=floor(0.5)=0,所以循环退出 */
for (stride = (2<<k) - 1; stride > 0 && k >= 1; stride = (1<<k) - 1) { // 注意这里的左移运算的优先级低于减法的优先级,所以要打上括号
// printf("The stride is:%d\n", stride);
for (i = stride; i < N; i++) {
Temp = In[i];
for (j = i; j >= stride && Temp < In[j - stride]; j -= stride) {
In[j] = In[j - stride];
}
In[j] = Temp;
}
k -= 1;
}
return 1;
}
|