插入排序相比於氣泡排序(序列)是有所增進的,但仍然有待改進,當然效率優劣,有時候還是需要取決於需要排序的資料來源。所以不能說一種排序演算法一定是絕對優於另一種,總所周知,一般優劣都是效率和記憶體綜合比較,有時候還設計併發安全的考慮。
插入排序從一開始設定的對比密度就是一定的,而且是最精密的,這樣子可能會導致對比和交換的頻率會很高。而希爾排序最主要的乙個優點是,即使乙個較小的元素在陣列的末尾,由於每次元素移動都以h(希爾增量)為間隔進行,因此陣列末尾的小元素可以在很少的交換次數下,就被置換到最接近元素最終位置的地方。
定義:將整個陣列根據間隔h分隔為若干個子陣列,它們相互穿插在一起,每一次排序時,分別對每乙個子陣列進行排序。
理解:這裡最重要的是h,簡單的講是跨度,專業術語可以稱為希爾增量。例子:比如h=3,就會將陣列的資料分為arr[0],arr[3],arr[6]…… 歸類為乙個子陣列進行比較 同理 arr[1],arr[4],arr[7]……也會組成乙個子陣列,這樣子完整的陣列就被拆分成了在原陣列上不連續下標組成的子陣列。這裡說明一下,這個h(希爾增量)沒有唯一的值代表它是最優的,這需要取決於需要排序的資料來源的規律性。
例圖(摘抄自
**實現:
1**說明:/**2
* 序列希爾排序3*
@param
arr4*/5
public
static
void shellsort(int
arr)
13while(h>0)
22 arr[j+h]=tmp;23}
24 }//
插入排序結束
25 h=(h-1)/3;//
計算下乙個間隔區間h(希爾增量),會逐漸縮小,必有乙個增量為1 相當於一次插入排序26}
27 }
上面的**很顯然是序列執行的,但由於資料的確定性,互相比較的和排序的資料是對應的子陣列,所以可以利用併發工具類改進為並行的希爾排序,待續……
排序之簡單排序方法
最近我整理了經常用到的排序演算法。排序就是按關鍵字的遞減或遞增順序對一組記錄重新進行整隊的操作。對於排序來說,主要考慮的因素就是時間複雜度 空間複雜度和演算法的複雜度。下面我先整理簡單選擇排序,直接插入排序,折半插入排序,希爾排序和氣泡排序這幾種。以下的所有的 都是用 c語言實現的,測試用例是 in...
排序演算法之簡單排序
進入找工作倒計時狀態了,計畫好好複習一下資料結構和相關演算法,估計用兩天時間把見過的排序演算法整理下,首先看一下時間複雜度為o n2 的演算法。首先參考大話資料結構定義乙個鍊錶類 include define maxsize 1000 using namespace std class sqlist...
簡單排序之選擇排序
口訣 兩兩相比 每輪取最小數交換 外層n 1 內層 i 1 n 優化 相比氣泡排序,雖然比較次數沒變,但是交換次數減少了。package sort 選擇排序 public class selection system.out.println 未排序前 for int i 0 i array.leng...