1. 程式人生 > >演算法導論------ShellSort希爾排序

演算法導論------ShellSort希爾排序

目錄

  Shellsort是最古老的排序演算法之一,該演算法以其發明者Donald L. Shell的名字命名(1959)。在ShellSort排序演算法之前的演算法時間複雜度基本都是O(n2),該演算法是突破這個時間複雜度的第一批演算法之一。另外 Shellsort 是快速、易於理解和易於實現的。 然而,其複雜度分析有點複雜。

1.Shellsort的思想

  學過InsertSort排序的都應該瞭解,直接插入排序演算法適用於 基本有序和資料量不大的排序序列。基於這兩點1959年Donald L. Shell提出了希爾排序,又稱“縮小增量排序”。

基本有序:就是小的關鍵字基本都在前面,大的關鍵字基本都在後面,不大不小的關鍵字基本都在中間。例如:{2

13647589}就可以稱為基本有序,但{159378246}就談不上基本有序。—–《大話資料結構》

Shellsort的思路如下:

a. 將待排序的資料序列排列在二維陣列中
b. 對陣列的列進行排序

  經過上面兩步處理後資料序列被部分排序。 重複上述過程,但每次使用較窄的二維陣列,即陣列具有較少數量的列。 在最後一步中,陣列只包含一列。 在每個步驟中,序列的排序增加,直到在最後一步中它被完全排序。 然而,由於在前面的步驟中獲得的序列的預排序,每個步驟中必需的排序操作的數量是有限的。

示例:37905168420615734982是要排序的資料序列。 首先,它被排列在具有7列(左)的陣列中,然後列被排序(右):

將待排序的資料序列排列在二維陣列中 對陣列的列進行排序後
38774392400956811265 37834724900956811256

  經過一次ShellSort後,序列變成33205157440616879982 。資料元素89現在已經到達序列的末尾,但是小元素2也仍然存在。 在下一步中,序列被排列成3列,這些列又被排序:

將待排序的資料序列排列在二維陣列中 對陣列的列進行排序後
30541783570692214689

相關推薦

演算法導論------ShellSort排序

目錄   Shellsort是最古老的排序演算法之一,該演算法以其發明者Donald L. Shell的名字命名(1959)。在ShellSort排序演算法之前的演算法時間複雜度基本都是O(n2),該演算法是突破這個時間複雜度的第一批演算法之一。另外 Sh

【S-排序】python實現八大排序演算法之4-排序ShellSort

希爾排序ShellSort 起源: 直接插入法的改進演算法。希爾排序(Shell Sort)是插入排序的一種。也稱縮小增量排序,是直接插入排序演算法的一種更高效的改進版本。希爾排序是非穩定排序演算

排序--ShellSort 排序

logs 如果 github str close blob www. 部分 什麽   希爾排序 no 實現   希爾排序其實就是插入排序。只不過希爾排序在比較的元素的間隔不是1。 我們知道插入排序 都是 一個一個和之前的元素比較。發現比之前元素小就交換位置。但是希爾排序可能

排序演算法3】排序

此篇我是17年7月份有幸閱讀到MoreWindows的此篇部落格 希爾排序 可惜的是當時不是很懂。又因工作繁忙以至於忘了此事。直到最近換完工作才有想起有此坑還未填上,便又翻出看了一遍。這次有了全新的認識。特此記錄 現在才想起當時為何看的不是很懂,是因為此篇部落格中的實驗中間省略了一小

排序演算法4——圖解排序及其實現

排序演算法1——圖解氣泡排序及其實現(三種方法,基於模板及函式指標) 排序演算法2——圖解簡單選擇排序及其實現 排序演算法3——圖解直接插入排序以及折半(二分)插入排序及其實現 排序演算法4——圖解希爾排序及其實現 排序演算法5——圖解堆排序及其實現 排序演算法6——圖解歸併排序及其遞迴與非

八種排序演算法Java實現-排序

/*********希爾排序先從0定義再到gap*********************/ public static int[] shell2(int []num,int len){

圖解排序演算法及實現——排序 (Shell Sort)

希爾排序(ShellSort)也稱增量遞減排序演算法,即跨多步版的InsertionSort,是InsertionSort基礎上的改進版。InsertionSort可以看作ShellSort中gap=1的特例。希爾排序是非穩定排序演算法。 希爾排序通過將全部元

圖解排序演算法(二)之排序

  希爾排序是希爾(Donald Shell)於1959年提出的一種排序演算法。希爾排序也是一種插入排序,它是簡單插入排序經過改進之後的一個更高效的版本,也稱為縮小增量排序,同時該演算法是衝破O(n2)的第一批演算法之一。本文會以圖解的方式詳細介紹希爾排序的基本思想及其程式碼實現。 基本思想   希爾

面試常考:排序演算法2(排序,歸併排序,堆排序

希爾排序 O(N^d),最壞O(N^2),不穩定 void ShellSort(int A[],int N) { /*O(N^d),最壞O(N^2),不穩定*/ int Si,D,P,i; int tmp; int Sedgewick[]={929,505,209,109,41,

演算法學習筆記--排序

希爾排序:這是一種基於插入排序的快速的排序演算法。 這種排序的主要思想就是:使陣列中任意間隔為h的元素都是有序的,這樣的陣列稱為h有序陣列。 如下圖,就是一個h有序陣列(h=4): 實現希爾排序的方法就是對於每一個h,用插入排序的方式,將h個子陣列獨立

Java排序演算法(五)--排序ShellSort

希爾排序(插入排序-漸減增量排序diminishing increment sort): 思想:1.將原始陣列按照增量分解為多個數組,分別按插入排序調好子序列的順序;

排序演算法--插入排序排序

希爾排序是對直接插入排序演算法的改進,把整個序列分割為若干子序列,對每個子序列進行直接插入排序,最後對整個序列進行直接插入排序(因為經過前面的子序列排序,整個序列基本有序,最後進行一次直接插入排序效率會比一開始就做排序高)。 如果掌握了直接插入排序,那麼希爾排序也比較容易理解了

排序演算法之插入排序(直接插入、排序

前言 一個好的排序演算法對於程式的優化會有很大的提升,雖然在許多語言的類庫中就存在了N種排序方法,但是隻有在瞭解了每一種排序演算法後才能更好的在實際中運用這些演算法。這裡我主要說明插入排序中的直接插入以及希爾排序的實現。 直接插入 直接插入排序是最簡單的排序演算法之一。對於直

排序演算法(直接插入、氣泡排序、選擇排序、快速排序排序、堆排序、歸併排序

main函式 int main() { int data[] = {1,2,6,3,4,7,7,9,8,5}; //bubble_sort(data,10); //select_sort(data,10); Insert_Sort(data,10); fo

插入排序——排序(ShellSort)

希爾排序,也叫遞減增量排序,是插入排序的一種更高效的改進版本。希爾排序是不穩定的排序演算法。 原理:希爾排序通過將比較的全部元素分為幾個區域來提升插入排序的效能。這樣可以讓一個元素可以一次性地朝最終位置前一大步。然後演算法再取越來越小的步長進行排序,演算法的最後一步就是普通的插入排序,但

Python 演算法 - 排序

# coding=utf-8 # 希爾排序 def shell_sort(lst=[]): """ 希爾排序(Shell Sort)是插入排序的一種。也稱縮小增量排序,是直接插入排序演算法的一種更高效的改進版本。希爾排序是非穩定排序演算法,時間複雜度為O(nlogn)

排序演算法2---排序

希爾排序 基本思想:希爾排序是插入排序的一個變種。不同之處在於我們按步長gap分組,對每組的記錄採用直接插入排序,隨著步長的逐漸減少,分組包含的記錄越來越多,直到gap=1時,構成了一個有序記錄。 時間複雜度: O(n^1.25) ~ 1.6*O(n^1.25)

《資料結構與演算法》之排序演算法(插入排序排序

3、插入排序 插入排序的基本操作就是將一個數據插入到已經排好序的有序資料中,從而得到一個新的、個數加一的有序資料,演算法適用於少量資料的排序,時間複雜度為O(n^2),是穩定的排序方法。插入演算法把要排序的陣列分成兩部分:第一部分包含了這個陣列的所有元素,但將最後一個元素除外(讓陣列多一個空間才

SWUST資料結構--排序演算法實現

#include<iostream> using namespace std; int main(){ int i,n; int a[50]; cin>>n; for(i=0;i<n;i++) cin>>a[i]; for(i=0;i<

排序演算法c語言描述---排序

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!