- 常见算法时间复杂度
- 希尔排序基本思想
基本思想:希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
优点:快,数据移动少
缺点:不稳定,增量的取值无确切答案,只能凭经验来取
- 代码实现
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
void println(int array[], int len)
{
int i = 0;
for(i=0; i<len; i++)
{
printf("%d ", array[i]);
}
printf("\n");
}
//nlogn 先宏观调整再微观调整
void ShellSort(int array[], int len) //
{
int i = 0;
int j = 0;
int k = -1;
int temp = -1;
int gap = len;
do
{
//先分组,经过若干次后,收敛为1
gap = gap / 3 + 1; //gap /2345 2000 都行 //O(n 1.3) gap = 1;
//分完组后,每组开始排序,按照插入排序的方法来
for(i=gap; i<len; i+=gap)
{
k = i;//记录要比较的数的下标
temp = array[k];//要比较的数
//要比较的数和当前分组数做比较,若当前分组有序数较大,将对应分组数值往后移动
for(j=i-gap; (j>=0) && (array[j]>temp); j-=gap)
{
array[j+gap] = array[j];//分组值往后移动
k = j;//记录要比较的数的最新下标
}
//更新当前分组要比较的数的最新值
array[k] = temp;
}
}while( gap > 1 );
}
int main()
{
int array[] = {1,12, 5, 433, 253, 216, 7,34,100};
int len = sizeof(array) / sizeof(*array);
println(array, len);
ShellSort(array, len);
println(array, len);
system("pause");
return 0;
}