3-18(排序的完結)

排序:算法

就是使一串數據,按照其中的某個或某些關鍵字大小,遞增或遞減的排序操做。數組


穩定性指的是:當有相同元素時,排序完成後能夠保證其相對位置不變,則就是穩定,若是不能保證其相對位置不變,那就不是穩定的。ide

一、插入排序優化


直接插入排序:在一個有序的序列中插入數據,使其序列仍然有序。spa

時間複雜度爲O(N^2),最好狀況爲O(N)。指針

空間複雜度爲O(1)排序

是一種穩定的排序算法。遞歸


希爾排序:先選定一個整數gap,把待排序的數據分爲若干組,並對每一組進行排序。也就是直接插入排序的優化,根據gap大小,先進行了一次預排序,再將gap依次改變直到爲1,其排序就是直接插入排序了。gap必定爲:gap=gap/n+1;加1是爲了gap必定會等於1.內存

當gap>1時,都是預排序,當gap=1時,就爲直接插入排序。it

時間複雜度爲O(N^1.3)

是不穩定的排序。


二、選擇排序

思想:每次在待排序數據中選出最小或最大的數據,存放在序列的起始位置。


直接選擇排序:效率很是低,

時間複雜度爲O(N^2);

空間複雜度爲O(1);

排序算法不是穩定的。


堆排序:是利用建堆來排序的。

若是須要降序,則建小堆,若是升序,則建大堆

時間複雜度爲O(N*logN)

空間複雜度爲O(1);

是不穩定的排序算法。



三、交換排序


冒泡排序:就是將數據一一比較,每次比較完成都會產生一個數,在其本身位置上,須要比較n-1次。

時間複雜度爲O(N^2)。

空間複雜度爲O(1)。

時穩定的排序算法。


快速排序

時間複雜度爲O(N*logN)

空間複雜度爲O(logN)

不穩定的排序算法。


hoare法(左右指針法)

就是將begin和end依次移動,若是升序,則begin這段找大與key,end找小於key的,找到就互換,知道begin==end。

最右邊作key,左邊先走,左邊作key,右邊先走。由於這樣作,必定能夠肯定最後停的位置會和key交換。


挖坑法:

就是找左/右一端爲key,使其爲一個空位,在其右/左找個數插入其坑位,這樣被插入數據的位置就變爲坑位,再在左/右找個數插入,知道begin==end。



先後指針法

定義2個變量prev和cur,cur=begin,prev=begin-1;cur找小,遇到小,則prev前進一個,再互換cur和prev的值。遇到大,則cur前進,prev不變。


快排什麼狀況下最慢:  數據有序的時候。能夠利用三數取中法來解決這個問題。


將快排的遞歸轉化爲非遞歸。利用棧就能夠,將待排數據的下標放到棧裏面。利用棧實現遞歸的過程

由於遞歸有時候會形成棧溢出。因此須要非遞歸。


四、歸併排序

思想:就是將2個有序的序列,歸併爲一個有序的序列。

時間複雜度爲O(NlogN)

空間複雜度爲O(N)

穩定的排序算法



五、計數排序(非比較排序)

思想:一、統計每一個元素出現的次數。再按照次數將每一個元素返回回去。

按照最大值與最小值之間的差值,來定義統計次數數組的大小range.

時間複雜度爲O(MAX(range,N))

空間複雜度爲O(range)

是個穩定的排序算法。


補充知識點:

假設有一個10個G的大文件,須要將此排序。

能夠將這個10G大文件切成10個1G的小文件,放到內存裏面對這10個進行排序(建議使用快排),而後將這10個排好序的文件進行歸併,獲得一個10G有序的大文件。

主要須要注意:歸併排序,計數排序,今天剛剛學的。

相關文章
相關標籤/搜索