上一節寫了自己怎麼實現的插入排序中的直接插入排序,現在介紹一下自己對希爾排序的理解。
希爾排序的思路很簡單,給定一個無序的數組,
首先是確定一個間隔d,d是用來對數組進行分組的,然後再對分組以後的每組數據進行組內排序,排序完成後在將d的值縮小,
然後再將數據按d進行分組,再對各個分組的數據進行排序
......
直至d=1,完成最後一次整個分組的排序,得到最後的結果即爲排好序的數組。
本次分組d是按照數組的長度對摺的方式來取的,
即,10個元素,第一次是d = (int)10/2=5,
第二次d=(int)5/2=2;
第三次是d=(int)2/2=1;
d=1是最後一次分組,則排序結束。
要注意的是:
1、本次交換使用的是傳入數組地址的形式,因爲數組元素之間的交換不可以用值傳遞,只能用地址傳遞,所以要注意。
2、對於排序,是改進了冒泡排序,將原來的相鄰元素之間的比較改爲相鄰d個元素之間進行比較。d=1時即爲冒泡排序。
希爾排序的主要代碼如下:
#include <stdio.h>
#include <stdlib.h>
void swap(int* a,int* b)
{
int t;
t = *a;
*a = *b;
*b = t;
}
void FuncSort(int array[],int len,int d)
{
int i,j;
for(i=0;i<len-1;i++)
{
for(j=0;j<len-1-i;j++)
{
if(j+d <=len-1)
{
// printf("---------------------%d--------------j = %d----------d= %d-----\n",j,j+d,d);
if(array[j] > array[j+d])
{
//printf("需要交換第%d個元素%d和%d個元素%d\n",j+1,array[j],j+d+1,array[j+d]);
swap(&array[j],&array[j+d]);
}
//printf("\n");
}
}
}
}
void showList(int array[])
{
int i=0;
for(i=0;i<10;i++)
printf("%d ",array[i]);
}
int main()
{
int list[10]= {49,38,65,97,76,13,27,49,55,4};
int d=10,t;
int count=1;
for(t = (int)d/2;t>=1;t=t/2)
{
FuncSort(list,10,t);
//printf("第%d次排序結果:",count);
//showList(list);
//printf("\n");
count++;
}
showList(list);
return 0;
}
如果按照d=5,3,1的分組來進行,則會是下面的結果: