1、shell排序(希尔排序)
思想:把记录按下标的一定增量分组,对每组使用直接插入算法排序;随着增量逐渐减少,每组包含的关键字越来越多,当增量减少至1时,整个文件恰被分为一组,算法终止。
优点:直接插入排序的改进版。
(1)不需要大量的辅助空间;(2)时间复杂度与增量序列的选取有关,(希尔增量时间复杂度为O(n^2)),希尔排序的时间复杂度下限是O(n(log2n)),对于中等大小规模表现良好;(3)最坏情况和平均情况下执行效率相差不是很大,而快排在最坏情况下执行的效率会非常差。
- 希尔增量排序代码:
#include <stdio.h>
void shellsort(int array[], int len)
{
int dist; //distance
int i;
int j;
int temp;
for (dist = len / 2; dist > 0; dist /= 2)
{
for (i = dist; i < len; i++)
{
for (j = i - dist; (j >= 0) && (array[j] > array[j+dist]); j -= dist)
{
temp = array[j];
array[j] = array[j+dist];
array[j+dist] = temp;
}
//
// if (array[i-dist] > array[i]) //(X)要注意:交换后,之前的顺序要保持正确。。。。。
// {
// temp = array[i-dist];
// array[i-dist] = array[i];
// array[i] = temp;
}
}
}
}
int main()
{
int i = 0;
int array[20] = {13, 5, 4, 1, 2, 9, 14, 11};
for (; i < 8; i++)
{
printf("%d\t", array[i]);
}
printf("\n");
shellsort(array, 8);
for (i = 0; i < 8; i++)
{
printf("%d\t", array[i]);
}
printf("\n");
return 0;
}