各種排序,白話版原理思想

2021-07-03 17:52:48 字數 2403 閱讀 9310

內部排序:

一般來說:存在不相鄰交換的排序演算法是不穩定的,相鄰交換的排序演算法是穩定的;對於相鄰交換的穩定排序演算法,通過控制交換條件可以轉換成不穩定排序演算法;冒泡、插入、歸併和基數排序是穩定的;選擇、快速、希爾和堆排序是不穩定的。

一、氣泡排序

從陣列的頭部開始迴圈,判斷相鄰的兩個元素,如果前乙個元素大於後乙個元素,那麼交換兩者,直到這一次過程將待排序部分中的最大值,移到最後。每一次迴圈過程就像冒泡一般將最大值一步一步移到最後,時間複雜度o(n2),穩定排序,原址排序。

原理是臨近的數字兩兩進行比較,按照從小到大或者從大到小的順序進行交換,

這樣一趟過去後,最大或最小的數字被交換到了最後一位,

然後再從頭開始進行兩兩比較交換,直到倒數第二位時結束。

一直迴圈到只剩下乙個元素不能再進行交換。

void bubble_sort(t arr, int len)  }

二、插入排序

將陣列看做兩部分,一部分是以排好序的,一部分是未排好序的,剛開始將第乙個元素看做是已經排好序的,對於未排好序的元素,然後依次從後遍歷排好序的陣列,如果它比元素小則交換兩者,直到找到比其小的元素。時間複雜度o(n2),穩定排序,就地排序。

三、選擇排序

首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小元素,然後放到排序序列末尾。以此遞迴。(就地,但是非穩定的,以為發生交換是不遵循相對順序的)。

四、希爾排序

先取乙個正整數,開始一般為數組長的二分之一,然後講陣列中所有間隔為d的,放在一起進行插入排序,然後再取乙個數為原來正整數的二分之一重複以上過程,直到該值為1 為止。(就地,非穩定性)

五、歸併排序

將待排序的陣列分為兩個區間,遞迴的對兩個區間進行歸併排序,然後將已排序好的兩個區間進行合併,遞迴的終止條件是區間的大小為1。(需要額外的陣列,穩定排序)

六、快速排序

先確定乙個主元,然後把比它小的放在左邊,大的放在右邊(具體的實現是從兩邊找,找到一對後交換),最後得到這個中間值位置,然後對兩邊分別使用這個過程(遞迴)。遞迴的終止也是條件子區間的大小為1。(就地排序,非穩定)

七、堆排序

首先建立乙個最大堆,該陣列的最大元素就在最大堆的根節點,然後每次交換陣列最後的乙個元素和根元素,這樣最大值就位於了它應該在的位置,然後對最大堆進行調整,在遞迴的交換新陣列的最後乙個元素和根元素。(就地排序,非穩定)

八、基數排序

要保證遍歷的穩定性,首先從個位從大到小排列,然後遞進的到十位、百位。

時間複雜度o(n),看似比快排更快,但是在這兩個表示式中,隱藏在時間複雜度中的常量因子是不同的,在處理n個關鍵字時,儘管基數排序的迴圈次數較少,但每一輪消耗的時間要長得多,並且快排更適合底層硬體實現,並且基數排序不是就地排序,需要額外的空間。

九、計數排序

對於每乙個輸入元素x,確定小於x的元素個數,這樣就可以確定x元素的位置,然後從陣列後依次確定陣列中元素的位置,(需要兩個輔助陣列,存放新陣列,存放大於等於下標的元素個數,穩定排序,從後往前的)

十、桶排序

根據資料的特徵分為n個桶,對於每個資料都會落入其中的乙個桶中,然後先後對每個桶進行排序,然後遍歷每個桶,把桶中元素列出來即可(需要輔助的資料結構,穩定排序)

外部排序:

十一、多路並歸

外部排序指的是大檔案的排序,即待排序的記錄儲存在外儲存器上,待排序的檔案無法一次裝入記憶體,需要在記憶體和外部儲存器之間進行多次資料交換,以達到排序整個檔案的目的。外部排序最常用的演算法是多路歸併排序,即將原檔案分解成多個能夠一次性裝人記憶體的部分,分別把每一部分調入記憶體完成排序。然後,對已經排序的子檔案進行歸併排序。(對於k路歸併,如果簡單的找出這k路的最小值,需要k-1次比較,採用勝者樹或者敗者樹,則比較次數為logk次,每次比較之後,得到最小者放入其他檔案中,然後再從最小的那個檔案取出下乙個元素,直到所有k路  全部為空為止)

對於每兩路採用勝者樹方法,較小者進入下一輪,直到本輪決出最小者。

top k(最小的k)演算法:

1.     隨機化的快速排序演算法,從每次需要排序的區間隨機選取軸值,然後分兩邊,得到軸值的位置資訊pos,如果pos小於k則丟棄(start,k-1),反之丟棄(k+1,end)

2.     最大堆演算法:建立k個值的最大堆,如果當前值大於根節點則不管,如果小於根節點,則交換兩者,然後對最大堆進行調整。

海量資料的處理:

方法一:不能全部加入記憶體,根據hash劃分成多個小檔案,然後對小檔案進行處理,再歸併。

方法二:bitmap,布隆過濾器等,1g個記憶體大概能處理1億的資料。

1. 數億個重複字串,找出出現次數最多的k個字串:

首先用hash表記錄每個字串出現的次數,然後建立乙個k大小的最小堆,對於後面的每個字串比比較其出現的次數和根節點出現次數的大小,小於則跳過,大於則替代根節點,然後對最小堆進行調整。(在統計次數方面,也可以採用tire數來計算字串出現的次數,然後再用最小堆來找出最多的k個字串)

快速排序白話

總的說來,要直接默寫出快速排序還是有一定難度的,因為本人就自己的理解對快速排序作了下白話解釋,希望對大家理解有幫助,達到快速排序,快速搞定。快速排序是c.r.a.hoare於1962年提出的一種劃分交換排序。它採用了一種分治的策略,通常稱其為分治法 divide and conquermethod ...

白話排序演算法(希爾排序)

前面已經提過最基本的三種排序 選擇,插入,冒泡 這裡,下面我再來說說希爾排序。希爾排序其實屬於插入演算法,但又是優化的插入演算法,比之前演算法有了較大的改進。希爾排序的基本思想 先取乙個小於n的整數d1作為第乙個增量,把檔案的全部記錄分成d1個組。所有距離為dl的倍數的記錄放在同乙個組中。先在各組內...

白話版出師表

發信人 forestttt 風入松 信區 joke 標 題 出師表翻譯成白話文,nb 發信站 水木社群 thu mar 11 11 45 26 2010 站內 你亮叔我跟你講幾句 你爸當年出來混,半道上就給掛了 現在地盤又分成三塊了,益州好 像咱也罩不住了,這世道眼瞅著要杯具了。但是你爸留下的保鏢還...