內部排序:數據所有在內存中進行排序
外部排序:數據量太大,不能一次在內存中進行排序,所以,在排序的過程當中須要使用到外部存儲介質算法
將一個數據插入到已經有序的序列中獲得一個新的有序序列
思路:從第二個元素開始進行插入排序數組
將序列分紅多個子序列分別進行直接插入排序,待整個序列基本有序時,再對總體序列進行直接插入排序。
核心是分組spa
分組策略通常採用增量分組策略,d = {n/2 ,n/4, n/8 .....1} n元素的個數,d爲要分組元素的間隔
好比:2, 5, 4, 3, n = 4, 第一趟d = n / 2 = 4 / 2 = 2,分組爲 [2, 4], [5, 3]
blog
基本思想
從小到大:從待排序的序列中選擇一個最小的數與第一個位置交換,而後在剩餘的數中選擇一個最小的數據與第二個位置交換,依次類推,直到倒數第二個數與倒數第一個數進行比較交換位置爲止。排序
基本思想從小到大:從待排序的序列中每次找出最小的數和最大的數分別與第一個元素和最後一個元素進行位置交換,而後在剩餘的數中繼續找出最小的數和最大的數分別與第二個元素和倒數第二個元素進行位置交換。依次類推,直到剩餘的數爲1或者爲0位置。內存
樹形選擇排序
堆定義:樹的子節點必須都比父節點大或者小,所以,分爲大頂堆和小頂堆
排序思想變量
初始時把待排序的n個元素的序列當作是順序存儲的二叉樹(一維數組存儲二叉樹)。調整序列中元素的順序使它們成爲一個堆,此時,將堆頂的元素取出,那麼將會獲得n個元素中最小的(最大的)元素。而後,對剩餘的n-1元素從新構建成一個堆,那麼將會獲得剩餘n-1個元素中最小的(最大的)元素,依次類推,直到剩餘2個元素的堆,對它們進行比較交換。
堆排序的兩個主要問題:
一、將n個元素構建成堆
二、對剩餘的元素如和構建成新的堆
調整小頂堆的方法:
一、假設n個元素,輸出一個堆頂元素還剩n-1個元素,將堆中最後一個元素放入到堆頂元素所在的位置
二、將堆頂節點與左右節點進行比較,選擇最小的節點與堆頂節點進行交換
三、若是交換後仍是破壞了堆結構,則重複2,直到交換到葉子節點位置爲止
構建小頂堆
一、假設n個元素,這n個元素構成一個二叉樹,可是不必定是堆,此時,若是把該樹的葉子節點看作樹的話,是符合堆的
二、尋找一個葉子節點,而後,從該葉子節點開始調整,直到整個樹符合堆結構
尋找建立堆節點的位置:(n - 1) / 2這個位置的節點要麼是葉子節點,要麼是葉子節點的父節點
假設序列爲 (5 3 4 1 6),奇數個元素二叉樹
二叉樹結構爲方法
(n - 1) / 2 = (5 - 1) / 2 = 2, 則下標爲2的元素爲4,此時,4爲葉子節點,能夠從4這個節點進行調整
假設序列爲 (5 3 4 1 6 12) ,偶數個元素im
二叉樹結構爲
(n - 1) / 2 = (6 - 1) / 2 = 2, 則下標爲2的元素爲4,4爲葉子節點的父節點,從4這個節點開始調整
基本思想
從大到小排序:臨近的元素進行兩兩比較,若是前面的小於後面的則交換位置。如此,進行多趟(n - 1),則序列有序
第一種:加一個標誌變量,記錄某一趟排序是否進行了數據位置的交換,若是沒有則表明已經有序,則須要中止排序
第二種:每趟排序進行正反兩個方向的冒泡,一趟冒泡能夠獲得最大值和最小值
基本思想
一、選擇一個基準元素,一般選擇第一個或者最後一個元素
二、經過一趟排序,將序列分紅兩部分,一部分大於基準元素,另一部分小於基準元素
三、此時,基準元素已經在它正確的位置上了
四、對分紅的兩部分進行一樣的操做,依次類推,直到整個序列有序
基本思想
將兩個或者兩個以上的有序序列合併成一個有序序列。
將待排序序列R[0...n-1]當作是n個長度爲1的有序序列,將相鄰的有序序列成對歸併,獲得n/2個長度爲2的有序序列;將這些有序序列再次歸併,獲得n/4個長度爲4的有序序列;如此反覆進行下去,最後獲得一個長度爲n的有序序列
合併思想
在每次合併過程當中,都是對兩個有序的序列進行合併,這兩個有序序列分別爲R[low, mid]和R[mid+1, high]。先將他們合併到一個局部的暫存數組R2中,待合併完成後再將R2複製回R中。爲了方便描述,咱們稱 R[low, mid] 第一段,R[mid+1, high] 爲第二段。每次從兩個段中取出一個記錄進行比較,將較小者放入R2中。最後將各段中餘下的部分直接複製到R2中。通過這樣的過程,R2已是一個有序的序列,再將其複製回R中,一次合併排序就完成了。
算法思想
把數據進行分桶,分桶後桶和桶之間的數據是有序的,也就是說前一個桶中的最大值小於等於後一個桶中的最小值,而後對每一個桶中的數據進行排序,最後,把全部桶中的數據收集到一塊,則此時數據已經排好序了。
基數排序 是按照低位先排序,而後收集;再按照高位排序,而後再收集;依次類推,直到最高位。有時候有些屬性是有優先級順序的,先按低優先級排序,再按高優先級排序。最後的次序就是高優先級高的在前,高優先級相同的低優先級高的在前。基數排序基於分別排序,分別收集,因此是穩定的。