文章目錄
- 希爾排序的歷史
- 一、關于希爾排序
- 二、希爾排序的思路
- 三、代碼實體講解
- 總結
希爾排序的歷史
希爾排序按其設計者希爾(Donald Shell)的名字命名,該演算法由希爾 1959 年公布,
1、希爾排序是基于插入排序的以下兩點性質而提出改進方法的:
插入排序在對幾乎已經排好序的資料操作時,效率高,即可以達到線性排序的效率,
但插入排序一般來說是低效的,因為插入排序每次只能將資料移動一位,
提示:以下是本篇文章正文內容,下面案例可供參考
一、關于希爾排序
1、由于多次插入排序,我們知道一次插入排序是穩定的,不會改變相同元素的相對順序,但在不同的插入排序程序中,相同的元素可能在各自的插入排序中移動,最后其穩定性就會被打亂,所以shell排序是不穩定的,
2、雖然希爾排序的穩定性比較差,但是希爾排序是沖破二次時間屏障的第一批演算法之一,
3、簡單說一下希爾排序的思路,就我的理解而言:希爾排序首先先分組【我自己稱之為“希爾分組”】,之后把分好的組別分別按照直接插入排序的演算法來進行排序,【當我自己學習該演算法的時候,我首先先列一個陣列,之后分組,然后往紙上寫代碼,找不同分組的共性,然后統一成一片代碼】
4、另外強調一點的是,學習該演算法之前必須完全先掌握直接插入排序演算法,因為希爾演算法實在該基礎上進行排序的,
鏈接: 【直接插入排序演算法】.
二、希爾排序的思路
一、希爾排序:“希爾分組”是根據步長【gap】來分的,
二、
假設有一個陣列 {1 ,2,3,4,5,6,7,8,9,0}
第一大組:步長gap=length/2=5;
,,,,,分成五小組,每組有2個數
第二大組:gap=gap/2=5/2=2;
,,,,,分成兩小組,每組有5個數
第三大組:gap=gap/2=2/2=1;【直到步長gap=1,才算結束】
,,,,,分成一個組,每組有10個數
三、之后就分別對以上各個小組用直接插入排序就可以了,
三、代碼實體講解
代碼如下(示例):
void ShellSort(int a[],int length){
int gap; //步長
int i,j,temp,x;
for(gap=length/2;gap>0;gap=gap/2){ //第一個for回圈是看需要幾次“希爾分組”【注意:每次“希爾分組”直接開始對其進行直接插入排序】
for(i=0;i<gap;i++){ //第二個for回圈是對分組后,就這個大組中有幾個小組,就回圈幾次
for(j=i+gap;j<length;j=j+gap){ //剩下兩個for回圈是對那個小組進行的直接插入排序
for(x=j;x>0;x=x-gap){
if(a[x]<a[x-gap]){
temp=a[x-gap];
a[x-gap]=a[x];
a[x]=temp;
}
else break; //一定記住:再次強調,一旦一不小心忘了帶,
//你就需要像我一樣進行,長達兩三個小時的查錯,
}
}
}
}
}
總結
,,目前對于希爾排序我就寫這么多,我希望看懂的哥們兒自己再總結一邊,然后自己寫下這個代碼,【你不一定寫的和我一毛一樣,我就和一大部分人寫演算法程式不一樣,但是思路是一樣的,雖然有時候自己根據理解寫的代碼,有可能編譯時間很長,但是這也是一種進步,這說明我可以寫出自己的代碼了,相當于我自己生了個孩子,我驕傲,即使他不是很完美,【博主是男生】,,,,但是在編程的路上我可以把它變得完美】
【還是那句話,一定要自己根據理解自己干一邊代碼,我相信我們以后會變得越來越好】
【兄弟姐妹們,加油!!!】
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/260683.html
標籤:其他
