【資料結構】希爾排序!!!
希爾排序是把記錄按下標的一定增量分組,對每組使用直接插入排序演算法排序;隨著增量逐漸減少,每組包含的關鍵詞越來越多,當增量減至1時,整個檔案恰被分成一組,演算法便終止。
希爾排序是將一組資料進行分組,再將分組的資料進行排序,這樣資料就會逐漸的趨向有序,當分組的個數為1的時候將整個陣列排序一遍,那麼整個陣列就排序好了。
基本思想:先將整個待排元素序列分割成若干個子序列(由相隔某個“增量”的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。
如圖:
當進行第一次分組的時候,將第一組資料裡面的元素進行排序,然後進行下一次的排序。
舉個栗子:
希爾排序存在的缺陷:
- 由於希爾排序在分組進行排序的時候進行的搬移資料是隔開的,所以在排序演算法上面是不穩定的。
實現程式碼:
void ShellSort(int *arr,size_t size)
{
if(NULL == arr)
return ;
int gap = 3;
while(gap--)
{
for(int i=0;i<gap;i++)
{
for(int j=i+gap;j<size;j += gap)
{
if(arr[j] < arr[j - gap])
{
int tmp = arr[j];
int k = j-gap;
while(k >= 0 && arr[k] > tmp )
{
arr[k+gap] = arr[k];
k -= gap;
}
arr[k+gap] = tmp;
}
}
}
}
}
在這裡gap的取值可以根據處理資料的實際情況來自己設定,一般採取的是折半取值發,即在處理gap的時候 gap = gap>>1;
相關文章
- 【PHP資料結構】插入類排序:簡單插入、希爾排序PHP資料結構排序
- python演算法與資料結構-希爾排序(35)Python演算法資料結構排序
- 資料結構上機——希爾排序(含監視哨版本)資料結構排序
- 對資料結構和演算法的總結和思考(三)--希爾排序資料結構演算法排序
- SpringCloud大型企業分散式微服務雲架構原始碼之【資料結構】-排序-希爾排序SpringGCCloud分散式微服務架構原始碼資料結構排序
- 希爾排序排序
- 理解希爾排序排序
- Java希爾排序Java排序
- 希爾排序(一)排序
- 希爾排序(二)排序
- 希爾排序(Shell Sort)排序
- C++希爾排序C++排序
- 希爾排序(C++)排序C++
- 排序演算法__希爾排序排序演算法
- 【排序演算法】- 希爾排序排序演算法
- 希爾排序——重溫排序(二)排序
- 【資料結構與演算法】高階排序(希爾排序、歸併排序、快速排序)完整思路,並用程式碼封裝排序函式資料結構演算法排序封裝函式
- C#資料結構與演算法系列(二十一):希爾排序演算法(ShellSort)C#資料結構演算法排序
- 【排序】插入類排序—(折半)插入排序、希爾排序排序
- PHP 排序演算法之希爾排序PHP排序演算法
- 排序演算法:Java實現希爾排序排序演算法Java
- 排序演算法 - 快速插入排序和希爾排序排序演算法
- JavaScript希爾排序簡單介紹JavaScript排序
- rust-algorithms:14-希爾排序RustGo排序
- 第二章 :查詢與排序-------希爾排序排序
- 資料結構與排序資料結構排序
- 【演算法】希爾排序的實現演算法排序
- python實現希爾排序演算法Python排序演算法
- 排序演算法(氣泡排序,選擇排序,插入排序,希爾排序)排序演算法
- 七、排序,選擇、冒泡、希爾、歸併、快速排序實現排序
- 三種插入排序 直接插入排序,折半插入排序,希爾排序排序
- 資料結構32:選擇排序資料結構排序
- 資料結構之計數排序資料結構排序
- 資料結構第10章 排序資料結構排序
- 程式猿修仙之路--演算法之希爾排序演算法排序
- 【譯】Swift演算法俱樂部-希爾排序Swift演算法排序
- 基礎演算法系列 之希爾排序演算法排序
- 資料結構(python) —— 【18排序: 桶排序】資料結構Python排序
- 資料結構--排序--插入排序--python語言描述資料結構排序Python