希爾排序算法的C語言實現(xiàn)示例
希爾排序,也稱遞減增量排序算法,是插入排序的一種更高效的改進版本。希爾排序是非穩(wěn)定排序算法。
希爾排序是基于插入排序的以下兩點性質而提出改進方法的:
插入排序在對幾乎已經排好序的數據操作時,效率高,即可以達到線性排序的效率
但插入排序一般來說是低效的,因為插入排序每次只能將數據移動一位
希爾排序通過將比較的全部元素分為幾個區(qū)域來提升插入排序的性能。這樣可以讓一個元素可以一次性地朝最終位置前進一大步。然后算法再取越來越小的步長進行排序,算法的最后一步就是普通的插入排序,但是到了這步,需排序的數據幾乎是已排好的了(此時插入排序較快)。
假設有一個很小的數據在一個已按升序排好序的數組的末端。如果用復雜度為O(n2)的排序(冒泡排序或插入排序),可能會進行n次的比較和交換才能將該數據移至正確位置。而希爾排序會用較大的步長移動數據,所以小數據只需進行少數比較和交換即可到正確位置。
一個更好理解的希爾排序實現(xiàn):將數組列在一個表中并對列排序(用插入排序)。重復這過程,不過每次用更長的列來進行。最后整個表就只有一列了。將數組轉換至表是為了更好地理解這算法,算法本身僅僅對原數組進行排序(通過增加索引的步長,例如是用i += step_size而不是i++)。
C語言實現(xiàn)示例
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define LEN 10
typedef int dataType;
//初始化數組,賦值整數隨機數
void initArr(dataType arr[], int len);
//希爾排序
void shellSort(dataType arr[], int len);
//交換兩個數
void swap(dataType &x,dataType &y);
//打印數組元素
void print(dataType arr[], int len);
int main()
{
 dataType arr[LEN];
 initArr(arr,LEN);
 printf("================希爾排序================");
 //輸出排序前的數組元素
 printf("\n排序前數組元素:");
 print(arr,LEN);
 shellSort(arr,LEN);
 printf("\n排序后數組元素:");
 print(arr,LEN);
 printf("\n");
 return 0;
}
//初始化數組,賦值整數隨機數
void initArr(dataType arr[], int len)
{
 int i = 0;
 srand((unsigned)time(NULL));
 for(i = 0; i < len; i++)
 arr[i] = rand();
}
//希爾排序
void shellSort(dataType arr[], int len)
{
 int h = 0;
 int i = 0;
 int j = 0;
 //設置步長
 for(h = 1; h < len; h = 3 * h + 1)
 ;
 while(h)
 {
 h /= 3;
 if(h < 1)
  break;
 for(i = h; i < len; i++)
  for(j = i; j >= h; j-=h)
  {
  if(arr[j-h] < arr[j])
   break;
  swap(arr[j-h],arr[j]);
  }
 }
}
//交換兩個數
void swap(dataType &x,dataType &y)
{
 dataType temp;
 temp = x;
 x = y;
 y = temp;
}
//打印數組元素
void print(dataType arr[], int len)
{
 int i = 0;
 for(i = 0; i< LEN; i++)
 {
 if(i % 5 == 0)
 {
  printf("\n");
 }
 printf("%d\t",arr[i]);
 }
}
欄 目:C語言
下一篇:Linux中使用C語言實現(xiàn)基于UDP協(xié)議的Socket通信示例
本文標題:希爾排序算法的C語言實現(xiàn)示例
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/2403.html
您可能感興趣的文章
- 04-02c語言編寫函數冒泡排序 c語言冒泡排序法函數
 - 01-10使用C++實現(xiàn)全排列算法的方法詳解
 - 01-10深入第K大數問題以及算法概要的詳解
 - 01-10深入N皇后問題的兩個最高效算法的詳解
 - 01-10用C++實現(xiàn)DBSCAN聚類算法
 - 01-10深入全排列算法及其實現(xiàn)方法
 - 01-10全排列算法的非遞歸實現(xiàn)與遞歸實現(xiàn)的方法(C++)
 - 01-10深入理解堆排序及其分析
 - 01-10深入單鏈表的快速排序詳解
 - 01-10貪心算法 WOODEN STICKS 實例代碼
 


閱讀排行
本欄相關
- 04-02c語言函數調用后清空內存 c語言調用
 - 04-02func函數+在C語言 func函數在c語言中
 - 04-02c語言的正則匹配函數 c語言正則表達
 - 04-02c語言用函數寫分段 用c語言表示分段
 - 04-02c語言中對數函數的表達式 c語言中對
 - 04-02c語言編寫函數冒泡排序 c語言冒泡排
 - 04-02c語言沒有round函數 round c語言
 - 04-02c語言分段函數怎么求 用c語言求分段
 - 04-02C語言中怎么打出三角函數 c語言中怎
 - 04-02c語言調用函數求fibo C語言調用函數求
 
隨機閱讀
- 08-05織夢dedecms什么時候用欄目交叉功能?
 - 01-10SublimeText編譯C開發(fā)環(huán)境設置
 - 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
 - 04-02jquery與jsp,用jquery
 - 01-10delphi制作wav文件的方法
 - 08-05DEDE織夢data目錄下的sessions文件夾有什
 - 01-11ajax實現(xiàn)頁面的局部加載
 - 01-10使用C語言求解撲克牌的順子及n個骰子
 - 08-05dedecms(織夢)副欄目數量限制代碼修改
 - 01-10C#中split用法實例總結
 


