#include "util.h"
//希尔排序:
void sort(int iArray[], int size)
{
int i = 0;
int j = 0;
int h = 1;
//希尔排序在插入排序算法的基础上,增加了一层外循环,则这层循环
//的次数取绝于当前需要排序数据的多少,这里采用了近似3的倍数为步
//长,直到h的值大于数据总数的1/3.
//比如: 当前size=360
//(1) h = 1
//(2) h = 4
//(3) h = 13
//(4) h = 40
//(5) h = 121
while ( h < size / 3 )
{
h = h * 3 + 1;
}
//希尔排序的原理是建立在插入排序的基础上的,原本插入排序执行里面
//的两个循环就可以了,但插入排序的优势主要用于相对有序的数据处理,
//所以希尔排序先进行几轮宽步长的插入排序,待这些数据已经接近有序
//时,外循环最后一次的h为1,此时内循环其实已经是一个标准的插入排序
//了,所以在处理已经接近有序的数据时,可以发挥插入排序的算法优势.
while ( h >= 1 )
{
//这两个循环是基于插入排序算法的,当h=1时,其实就是标准的插入
//排序算法.只不过这里通过外循环执行了多次插入排序,并且插入
//排序算法由原来比较固定相邻步长为1的两个数据,变成比较可变
//相邻块的数据.
for ( i = h; i < size; i++ )
{
for ( j = i; j >= h && less(iArray[j], iArray[j - h]) ; j-- )
{
exch(iArray, j, j - h);
}
}
//每经过一轮处理,缩短宽步长,使得最后h=1时,内循环成为标准的
//插入排序算法.
//|--------------|--------------|--------------| 第一轮
//|----|----|----|----|----|----|----|----|----| 第二轮
//......
//|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-| 最后一轮
h = h / 3;
}
}
int main()
{
int test[] = {2, 5, 7, 30, 12, 14, 3, 6};
sort(test, sizeof(test)/sizeof(test[0]));
arrayShow(test, sizeof(test)/sizeof(test[0]));
return 0;
}
<pre name="code" class="cpp">#include <stdio.h>
#include "util.h"
void arrayShow(int iArray[], int size)
{
int i = 0;
for ( i = 0; i < size; i++ )
{
printf("%d ", iArray[i]);
}
printf("\r\n");
}
int less(int a, int b)
{
if ( a < b ) return 1;
return 0;
}
int compare(int a, int b)
{
if ( a > b ) return 1;
if ( a < b ) return -1;
return 0;
}
void exch(int iArray[], int indexA, int indexB)
{
int tmp = iArray[indexA];
iArray[indexA] = iArray[indexB];
iArray[indexB] = tmp;
}
#include "util.h"//希尔排序:void sort(int iArray[], int size){ int i = 0; int j = 0; int h = 1; //希尔排序在插入排序算法的基础上,增加了一层外循环,则这层循环 //的次数取绝于当前需要排序数据的多少,这里采用了近似3的倍数为步 //长,直到h的值大于数