舞動的排序演算法~

Web開發者發表於2012-04-11

  在計算機中,排序演算法有很多,包括插入排序,堆排序,歸併排序,選擇排序,計數排序,基數排序,桶排序,快速排序等。插入排序,堆排序,選擇排序,歸併排序和快速排序都是比較排序,它們通過對陣列中的元素進行比較來實現排序,其他排序演算法則是利用非比較的其他方法來獲得有關輸入陣列的排序資訊。

  下面是 admin10000.com 整理的視訊案例來介紹選擇,冒泡,插入,歸併,快速和希爾排序。視訊由 Sapientia University 創作,他們以舞蹈的方式演繹各種排序演算法,創意無限,非常精彩。

  一、選擇排序 select sort

  選擇排序(Selection sort)是一種簡單直觀的排序演算法。它的工作原理如下。首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小元素,然後放到排序序列末尾。以此類推,直到所有元素均排序完畢。

  演算法思路:

  每一次從待排序的資料元素中選出最小的一個元素,順序放在已排好序的數列的最後,直到全部待排序的資料元素排完。

  演算法描述:

  1、第一輪排序,在無序區中選出最小的記錄,將它與無序區的第1個記錄交換,使有序區記錄個數增加1個(即記錄個數變為1個),無序區記錄個數減少1個。

  2、第二輪排序,在無序區中選出最小的記錄,將它與無序區的第1個記錄交換,使有序區記錄個數增加1個(即記錄個數變為2個),無序區記錄個數減少1個。

  3、如此下去,重複以上過程,直至最終完成排序。

<embed>

  二、氣泡排序 Bubble Sort

  氣泡排序(Bubble Sort)是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。

  演算法思路:

  依次比較相鄰的兩個數,將小數放在前面,大數放在後面。由於在排序過程中總是小數往前放,大數往後放,相當於氣泡往上升,所以稱作氣泡排序。

  設想被排序的陣列垂直豎立,將每個資料元素看作有重量的氣泡(為了便於理解,此處規定大數對應輕氣泡),根據輕氣泡不能在重氣泡之下的原則,從下往上掃描陣列,凡掃描到違反本原則的輕氣泡,就使其向上“漂浮”,如此反覆進行,直至最後任何兩個氣泡都是輕者在上,重者在下為止。

  演算法描述:

  1、在第一輪,首先比較第1個和第2個數,將小數放前,大數放後;然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。至此第一輪結束,將最大的數放到了最後。

  2、在第二輪,仍從第一對數開始比較(因為可能由於第2個數和第3個數的交換,使得第1個數不再小於第2個數),將小數放前,大數放後,一直比較到倒數第二個數(倒數第一的位置上已經是最大的),第二輪結束,在倒數第二的位置上得到一個新的最大數(其實在整個數列中是第二大的數)。

  3、如此下去,重複以上過程,直至最終完成排序。

<embed>

  三、插入排序 Insert sort

  插入排序(Insertion Sort)的演算法描述是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃描,找到相應位置並插入。插入排序在實現上,通常採用in-place排序(即只需用到O(1)的額外空間的排序),因而在從後向前掃描過程中,需要反覆把已排序元素逐步向後挪位,為最新元素提供插入空間。

  演算法思路:

  假定一個陣列的序是排好的,然後從前往後,如果有數比當前外層元素的值大,則將這個數的位置往後挪,直到當前外層元素的值大於或等於它前面的位置為止。這種演算法在排完前k個數之後,可以保證前k個元素是區域性有序的,保證了插入過程的正確性。

  演算法描述:

  1、從第一個元素開始,該元素可以認為已經被排序。

  2、取出下一個元素,在已經排序的元素序列中從後向前掃描。

  3、如果該元素(已排序)大於新元素,將該元素移到下一位置。

  4、重複第3步,直到找到已排序的元素小於或者等於新元素的位置。

  5、將新元素插入到下一位置中。

  6、重複第2步。

<embed>

  四、歸併排序 Merge sort

  歸併排序(Merge sort)是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。

  演算法思路:

  將兩個或兩個以上有序表合併成一個新的有序表,即把待排序序列分為若干個子序列,每個子序列是有序的。然後再把有序子序列合併為整體有序序列。

  演算法描述:

  1、申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列。

  2、設定兩個指標,最初位置分別為兩個已經排序序列的起始位置。

  3、比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置。

  4、重複第3步,直到某一指標達到序列尾。

  5、將另一序列剩下的所有元素直接複製到合併序列尾。

<embed>

  五、快速排序 Quick sort

  快速排序(Quick sort)是對氣泡排序的一種改進。由C. A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。

  演算法思路:

  通過一輪排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。

  演算法描述:

  1、設定兩個變數i、j,排序開始的時候,i是第一個元素的下標,j是最後一個元素的下標。

  2、從第j個元素開始向前搜尋,即由後開始向前搜尋,找到第一個小於第i個元素的數,設其下標為m,第i個元素與第m個元素交換。

  3、從第i個元素開始向後搜尋,即由前開始向後搜尋,找到第一個大於第m個元素的數,設其下標為n,第m個元素與第n個元素交換。

  4、重複第2步和第3步,直到m與n相等,則第一輪排序結束,確定下來的一個元素將陣列分割成獨立的兩部分,對這獨立的兩部分再進行快速排序,直至最終完成排序。

<embed>

  六、謝爾排序 Shell sort

  希爾排序(Shell Sort),也稱遞減增量排序演算法,是插入排序的一種高速而穩定的改進版本。希爾排序是基於插入排序的以下兩點性質而提出改進方法的:插入排序在對幾乎已經排好序的資料操作時, 效率高, 即可以達到線性排序的效率,但插入排序一般來說是低效的, 因為插入排序每次只能將資料移動一位。

  演算法思路:

  取一個小於陣列元素個數的整數作為第一個增量,把陣列的全部元素分組,同一組中的所有元素下標距離均為增量的倍數,先在各組內進行直接插入排序。然後,取第二個增量小於第一個增量重複上述的分組和排序,直至所取的增量等於1,即所有元素放在同一組中進行直接插入排序為止。

  演算法描述:

  1、取一個小於陣列元素個數的整數d1作為第一個增量,把陣列的全部元素分成d1個組,所有距離為d1的倍數的記錄放在同一個組中。在各組內進行直接插入排序。

  2、取第二個增量d2<d1重複上述的分組和排序。

  3、取更小的增量重複上述的分組和排序,直至所取的增量dt=1(dt<dt-1<……<d2<d1),即所有記錄放在同一組中進行直接插入排序為止。

<embed>

相關文章