常見的八種排序

 

 

 一、直接插入排序算法

 

直接插入排序的核心思想就是:將數組中的全部元素依次跟前面已經排好的元素相比較,若是選擇的元素比已排序的元素小,則交換,直到所有元素都比較過。
所以,從上面的描述中咱們能夠發現,直接插入排序能夠用兩個循環完成:數組

第一層循環:遍歷待比較的全部數組元素3d

第二層循環:將本輪選擇的元素(selected)與已經排好序的元素(ordered)相比較。
若是:selected > ordered,那麼將兩者交換blog

二、希爾排序排序

 

希爾排序的算法思想:將待排序數組按照步長gap進行分組,而後將每組的元素利用直接插入排序的方法進行排序;每次將gap折半減少,循環上述操做;當gap=1時,利用直接插入,完成排序。
一樣的:從上面的描述中咱們能夠發現:希爾排序的整體實現應該由三個循環完成:遞歸

第一層循環:將gap依次折半,對序列進行分組,直到gap=1io

第2、三層循環:也即直接插入排序所須要的兩次循環。具體描述見上ast

 

三、簡單選擇排序class

簡單選擇排序的基本思想:比較+交換。select

    1. 從待排序序列中,找到關鍵字最小的元素;
    2. 若是最小元素不是待排序序列的第一個元素,將其和第一個元素互換;
    3. 從餘下的 N - 1 個元素中,找出關鍵字最小的元素,重複(1)、(2)步,直到排序結束。
      所以咱們能夠發現,簡單選擇排序也是經過兩層循環實現。
      第一層循環:依次遍歷序列當中的每個元素
      第二層循環:將遍歷獲得的當前元素依次與餘下的元素進行比較,符合最小元素的條件,則交換。

 

四、堆排序

首先將序列構建稱爲大頂堆,將堆頂第一個元素放到最後,繼續構建大頂堆,直至堆中只剩一個元素

 

 

 

 

 五、冒泡排序(常見)

六、快速排序

快速排序的基本思想:挖坑填數+分治法

    1. 從序列當中選擇一個基準數(pivot)
      在這裏咱們選擇序列當中第一個數最爲基準數
    2. 將序列當中的全部數依次遍歷,比基準數大的位於其右側,比基準數小的位於其左側
    3. 重複步驟1.2,直到全部子集當中只有一個元素爲止。
      用僞代碼描述以下:
      1.i =L; j = R; 將基準數挖出造成第一個坑a[i]。
      2.j--由後向前找比它小的數,找到後挖出此數填前一個坑a[i]中。
      3.i++由前向後找比它大的數,找到後也挖出此數填到前一個坑a[j]中。
      4.再重複執行2,3二步,直到i==j,將基準數填入a[i]中

 

 七、歸併排序

歸併排序.gif
  1. 歸併排序是創建在歸併操做上的一種有效的排序算法,該算法是採用分治法的一個典型的應用。它的基本操做是:將已有的子序列合併,達到徹底有序的序列;即先使每一個子序列有序,再使子序列段間有序。
  2. 歸併排序其實要作兩件事:
  • 分解----將序列每次折半拆分
  • 合併----將劃分後的序列段兩兩排序合併
    所以,歸併排序實際上就是兩個操做,拆分+合併
  1. 如何合併?
    L[first...mid]爲第一段,L[mid+1...last]爲第二段,而且兩端已經有序,如今咱們要將兩端合成達到L[first...last]而且也有序。
  • 首先依次從第一段與第二段中取出元素比較,將較小的元素賦值給temp[]
  • 重複執行上一步,當某一段賦值結束,則將另外一段剩下的元素賦值給temp[]
  • 此時將temp[]中的元素複製給L[],則獲得的L[first...last]有序
    1. 如何分解?
      在這裏,咱們採用遞歸的方法,首先將待排序列分紅A,B兩組;而後重複對A、B序列
      分組;直到分組後組內只有一個元素,此時咱們認爲組內全部元素有序,則分組結束。

 八、基數排序

    1. 基數排序:經過序列中各個元素的值,對排序的N個元素進行若干趟的「分配」與「收集」來實現排序。
      分配:咱們將L[i]中的元素取出,首先肯定其個位上的數字,根據該數字分配到與之序號相同的桶中
      收集:當序列中全部的元素都分配到對應的桶中,再按照順序依次將桶中的元素收集造成新的一個待排序列L[ ]
      對新造成的序列L[]重複執行分配和收集元素中的十位、百位...直到分配完該序列中的最高位,則排序結束
    2. 根據上述「基數排序」的展現,咱們能夠清楚的看到整個實現的過程
相關文章
相關標籤/搜索