欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

希爾排序算法的C語言實現(xiàn)示例

 更新時間:2016年04月09日 17:15:24   作者:cqnuztq  
這篇文章主要介紹了希爾排序算法的C語言實現(xiàn)示例,希爾排序可以看作為一種高級的插入排序,需要的朋友可以參考下

希爾排序,也稱遞減增量排序算法,是插入排序的一種更高效的改進版本。希爾排序是非穩(wěn)定排序算法。

希爾排序是基于插入排序的以下兩點性質(zhì)而提出改進方法的:

插入排序在對幾乎已經(jīng)排好序的數(shù)據(jù)操作時,效率高,即可以達到線性排序的效率
但插入排序一般來說是低效的,因為插入排序每次只能將數(shù)據(jù)移動一位

希爾排序通過將比較的全部元素分為幾個區(qū)域來提升插入排序的性能。這樣可以讓一個元素可以一次性地朝最終位置前進一大步。然后算法再取越來越小的步長進行排序,算法的最后一步就是普通的插入排序,但是到了這步,需排序的數(shù)據(jù)幾乎是已排好的了(此時插入排序較快)。

假設(shè)有一個很小的數(shù)據(jù)在一個已按升序排好序的數(shù)組的末端。如果用復(fù)雜度為O(n2)的排序(冒泡排序或插入排序),可能會進行n次的比較和交換才能將該數(shù)據(jù)移至正確位置。而希爾排序會用較大的步長移動數(shù)據(jù),所以小數(shù)據(jù)只需進行少數(shù)比較和交換即可到正確位置。

一個更好理解的希爾排序?qū)崿F(xiàn):將數(shù)組列在一個表中并對列排序(用插入排序)。重復(fù)這過程,不過每次用更長的列來進行。最后整個表就只有一列了。將數(shù)組轉(zhuǎn)換至表是為了更好地理解這算法,算法本身僅僅對原數(shù)組進行排序(通過增加索引的步長,例如是用i += step_size而不是i++)。

C語言實現(xiàn)示例

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define LEN 10

typedef int dataType;

//初始化數(shù)組,賦值整數(shù)隨機數(shù)
void initArr(dataType arr[], int len);
//希爾排序
void shellSort(dataType arr[], int len);
//交換兩個數(shù)
void swap(dataType &x,dataType &y);
//打印數(shù)組元素
void print(dataType arr[], int len);

int main()
{
 dataType arr[LEN];
 initArr(arr,LEN);
 printf("================希爾排序================");
 //輸出排序前的數(shù)組元素
 printf("\n排序前數(shù)組元素:");
 print(arr,LEN);
 shellSort(arr,LEN);
 printf("\n排序后數(shù)組元素:");
 print(arr,LEN);
 printf("\n");
 return 0;
}


//初始化數(shù)組,賦值整數(shù)隨機數(shù)
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;
 //設(shè)置步長
 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]);
  }
 }
}

//交換兩個數(shù)
void swap(dataType &x,dataType &y)
{
 dataType temp;
 temp = x;
 x = y;
 y = temp;
}

//打印數(shù)組元素
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]);
 }
}

201649171620878.jpg (385×158)

相關(guān)文章

  • map插入自定義對象總結(jié)

    map插入自定義對象總結(jié)

    黑樹在插入節(jié)點時,必須依照大小比對之后在一個合適的位置上執(zhí)行插入動作。所以作為關(guān)鍵字,起碼必須有“<”這個比較操作符
    2013-09-09
  • C語言結(jié)構(gòu)體指針的具體使用

    C語言結(jié)構(gòu)體指針的具體使用

    結(jié)構(gòu)體指針是一種非常有用的數(shù)據(jù)類型,它可以讓我們更方便地操作結(jié)構(gòu)體,本文主要介紹了C語言結(jié)構(gòu)體指針的具體使用,非常具有實用價值,需要的朋友可以參考下
    2023-05-05
  • C/C++模擬實現(xiàn)煙花效果的示例代碼

    C/C++模擬實現(xiàn)煙花效果的示例代碼

    這篇文章主要為大家詳細介紹了C/C++模擬實現(xiàn)煙花效果的兩種簡單方法,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以了解下
    2024-01-01
  • Qt中PaintEvent繪制實時波形圖的實現(xiàn)示例

    Qt中PaintEvent繪制實時波形圖的實現(xiàn)示例

    本文主要介紹了Qt中PaintEvent繪制實時波形圖的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • C++缺省參數(shù)的理解

    C++缺省參數(shù)的理解

    這篇文章主要為大家介紹了C++缺省參數(shù),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • C++ decltype 說明符

    C++ decltype 說明符

    這篇文章主要介紹了C++ decltype 說明符,檢查實體的聲明類型,或表達式的類型和值類別。下面我們來看看文章中的具體內(nèi)容吧

    2021-12-12
  • c語言文件讀寫示例(c語言文件操作)

    c語言文件讀寫示例(c語言文件操作)

    這篇文章主要介紹了c語言文件讀寫示例(c語言文件操作),需要的朋友可以參考下
    2014-02-02
  • C++處理輸入字符串并轉(zhuǎn)為數(shù)組的操作

    C++處理輸入字符串并轉(zhuǎn)為數(shù)組的操作

    這篇文章主要介紹了C++處理輸入字符串并轉(zhuǎn)為數(shù)組的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • C++利用鏈表模板類實現(xiàn)簡易隊列

    C++利用鏈表模板類實現(xiàn)簡易隊列

    這篇文章主要為大家詳細介紹了C++利用鏈表模板類實現(xiàn)一個簡易隊列,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • C語言實現(xiàn)統(tǒng)計一行字符串的單詞個數(shù)

    C語言實現(xiàn)統(tǒng)計一行字符串的單詞個數(shù)

    這篇文章主要介紹了C語言實現(xiàn)統(tǒng)計一行字符串的單詞個數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07

最新評論