1.選擇排序
基本思想:
每一趟從待排序的數據元素中選出最小(或最大)的一個元素,順序放在已排好序的數列的最後,直到所有待排序的數據元素排完。
2.直接插入排序
基本思想:
每次將一個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子文件中的適當位置,直到所有記錄插入完成爲止。
3.冒泡排序
基本思想:
依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟:首先比較第1個和第2個數,將小數放前,大數放後。而後比較第2個數和第3個數,將小 數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。至此第一趟結束,將最大的數放到了最後。在第二趟:仍從第一對數開始比較(由於 可能因爲第2個數和第3個數的交換,使得第1個數再也不小於第2個數),將小數放前,大數放後,一直比較到倒數第二個數(倒數第一的位置上已是最大的), 第二趟結束,在倒數第二的位置上獲得一個新的最大數(其實在整個數列中是第二大的數)。如此下去,重複以上過程,直至最終完成排序。 因爲在排序過程當中老是小數往前放,大數日後放,至關於氣泡往上升,因此稱做冒泡排序。
4.Shell排序
基本思想:
先取一個小於n的整數d1做爲第一個增量,把文件的所有記錄分紅d1個組。全部距離爲dl的倍數的記錄放在同一個組中。先在各組內進行直接插人排序;而後,取第二個增量d2<d1重複上述的分組和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即全部記錄放在同一組中進行直接插入排序爲止。
該方法實質上是一種分組插入方法。
5.堆排序
基本思想:
① 先將初始文件R[1..n]建成一個大根堆,此堆爲初始的無序區
② 再將關鍵字最大的記錄R[1](即堆頂)和無序區的最後一個記錄R[n]交換,由此獲得新的無序區R[1..n-1]和有序區R[n],且知足R[1..n-1].keys≤R[n].key
③因爲交換後新的根R[1]可能違反堆性質,故應將當前無序區R[1..n-1]調整爲堆。然 後再次將R[1..n-1]中關鍵字最大的記錄R[1]和該區間的最後一個記錄R[n-1]交換,由此獲得新的無序區R[1..n-2]和有序區R[n- 1..n],且仍知足關係R[1..n-2].keys≤R[n-1..n].keys,一樣要將R[1..n-2]調整爲堆。 ……
直到無序區只有一個元素爲止。
6.快速排序
基本思想:
快速排序(Quicksort)是對冒泡排序的一種改進。
它的基本思想是:經過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的全部數據都比另一部分的全部數據都要小,而後再按此方法對這兩部分數據分別進行快速排序,整個排序過程能夠遞歸進行,以此達到整個數據變成有序序列。
7.歸併排序
基本思想:
歸併排序是創建在歸併操做上的一種有效的排序算法。該算法是採用分治法(Divide and Conquer)的一個很是典型的應用。將已有序的子序列合併,獲得徹底有序的序列;即先使每一個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱爲2-路歸併。
歸併操做的工做原理以下:
申請空間,使其大小爲兩個已經排序序列之和,該空間用來存放合併後的序列
設定兩個指針,最初位置分別爲兩個已經排序序列的起始位置
比較兩個指針所指向的元素,選擇相對小的元素放入到合併空間,並移動指針到下一位置
重複步驟3直到某一指針達到序列尾
將另外一序列剩下的全部元素直接複製到合併序列尾
8.基數排序
基本思想:
基數排序法又稱「桶子法」(bucket sort)或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些「桶」中,藉以達到排序的做用,基數排序法是屬於穩定性的排序,其時間複雜度爲O (nlog(r)m),其中r爲所採起的基數,而m爲堆數,在某些時候,基數排序法的效率高於其它的比較性排序法。
最高位優先(Most Significant Digit first)法,簡稱MSD法:先按k1排序分組,同一組中記錄,關鍵碼k1相等,再對各組按k2排序分紅子組,以後,對後面的關鍵碼繼續這樣的排序分 組,直到按最次位關鍵碼kd對各子組排序後。再將各組鏈接起來,便獲得一個有序序列。
最低位優先(Least Significant Digit first)法,簡稱LSD法:先從kd開始排序,再對kd-1進行排序,依次重複,直到對k1排序後便獲得一個有序序列。git