插入排序之希爾排序

上一節寫了自己怎麼實現的插入排序中的直接插入排序,現在介紹一下自己對希爾排序的理解。

希爾排序的思路很簡單,給定一個無序的數組,

首先是確定一個間隔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的分組來進行,則會是下面的結果:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章