細數那些我們熟悉的 排序!

2022-05-31 11:36:12 字數 3348 閱讀 7764

第乙個 ,不得不說的 是 《氣泡排序》

作為 乙個非常經典,又差勁的演算法 。

計算過程如下:

->每次遍歷陣列,通過對比,使最大的冒上去,

->這樣通過n次的輪循 ,可以使 排序的陣列有序。

優點:簡單,適用性強。

缺點:慢。

適用性:陣列,鍊錶.

性質:穩定性排序【打亂元素的穩定性,也就是 你不知道 這個元素 一開始是 3,3,3,排序後的 這個三是哪個三】。

複雜度:平均 n^2,在有序的情況下,可以 o(n) ,

**: 不寫

二:歸併排序:

前言:歸併排序,是利用分治的思想,

也就是說 將乙個大問題化為一些小問題,這樣在解決小問題的情況下,

在通過,合併操作,使以解決的小問題稱以解決的大問題。

計算過程如下:

->將乙個陣列遞迴的分解成倆斷->四段->八段->直到分解稱只有乙個元素

->在乙個元素的情況下,這斷可以認為是有序的,進而滿足解決了這個小問題

->對於合併,對於倆段有序的陣列,只要在每個陣列上打乙個index每次取最小的那個元素不,知道元素取完畢就好。

優點:穩定,效率一般(不斷的swap)

缺點:需要額外的記憶體。

適用性:陣列,鍊錶(需要預先處理出分段,麻煩,一般可以認為不支援).

性質:穩定性排序

複雜度:平均 n*log(n)。

**:

void mergesort(int v, int l, int r, int

tmparray)

int mid = l + (r - l) / 2

; mergesort(v , l, mid, tmparray);

mergesort(v , mid + 1

, r, tmparray);

for (int i = l, j = mid + 1, idx = l ; i <= mid || j <=r; )

else

} else

}for(int i = l; i <= r ; i ++)

}

三:堆排序:堆排序,人如其名,利用堆來排序,原理有些類似於氣泡排序,都是每次找出最大值。

盜圖->

簡要的說一下堆,一般的堆都是指 二叉堆,也就是,上圖是乙個小頂堆,也就是說,父親節點的元素值比他的兒子節點的元素的值都小。

陣列有乙個很好的性質 

對於  position = i 的元素 他的左兒子 可以表示為 i<<1(i*2) ,右兒子可以表示為i<<1|1 (i*2+1)

也正是因此堆可以用老模擬陣列的排序過程

void build(int * a, int pos, int

n)

else

}}void heapsort(int * a, int

n)

for(int i = n ; i > 1 ;--i)

}

過程:1.陣列作為堆初始化成為大頂堆。這樣堆頂元素是最大的

2.把堆頂元素的值和最後乙個位置元素的值做乙個交換,同時堆的大小減一。 ->這樣這個值,是所有元素中最大的且已經在最後面了。

3.上邊的操作就如同 刪除堆頂元素的操作,只不過把堆頂元素放到了最後。

4.刪除堆頂元素後進行更新操作,遞迴向下,保持堆的性質

5.重複2到4的操作,直到堆內沒有元素。

優點:穩定,效率一般(不斷的swap)。

缺點:穩定,同時中庸,比歸併排序要快(個人見解)。

適用性:陣列,(鍊錶不支援吧?)

性質:非穩定性排序

複雜度:平均 n*log(n)。

四:快速排序:

快排,為什麼叫快排?因為他快, 這個排序,也算是分治的思想,

和歸併的相反,先計算在遞迴分解,  而歸併是先遞迴分解,在合併。

過程,1.在這斷內選取出乙個關鍵的key值,同時指定倆個指標(就是位置表示符號)乙個起始,乙個結束(這裡先認為取左側第乙個,不是的可以,用swap來達到這個狀態)

3.同上,知道掃瞄到乙個比這個小的ok在此交換倆個指標指向的元素。在此從左側的指標開始掃瞄

4.重複2,3直到倆個指標指向同乙個位置,ok,本次掃瞄結束

5.這樣連個指標只想的位置賦值為key那麼左側都比他小, 右側都比她大,

6.資料根據指標的位置,查分為倆段 利用1-4這個過程,求解即可。

**:

void sort(int * v, int l ,int

r) v[low] =key;

sort(v, l, low - 1

); sort(v, low + 1

, r);

}

view code

優點:記憶體無額外消耗,平均而言了認為是最好的排序演算法。

性質,非穩定性排序。

複雜度n* logn,最壞情況下會退化到n^2

適用性,陣列,鍊錶。

,這個演算法的關鍵在於尋找那個key,能讓左右平衡一些(有三分寫法),這個演算法,掃瞄多餘交換.

有些**我沒寫

translate with

xenglish

arabic

hebrew

polish

bulgarian

hindi

portuguese

catalan

hmong daw

romanian

chinese simplified

hungarian

russian

chinese traditional

indonesian

slovak

czech

italian

slovenian

danish

japanese

spanish

dutch

klingon

swedish

english

korean

thai

estonian

latvian

turkish

finnish

lithuanian

ukrainian

french

malay

urdu

german

maltese

vietnamese

greek

norwegian

welsh

haitian creole

persian

細數那些值得我們學習的大神們

學習程式設計是乙個循序漸進的過程,沒有人能夠萬丈高樓平地而起 可能你在學校或者培訓機構裡有老師教你寫程式,但是這僅僅只是乙個開始,師傅領進門,修行靠自身 你可以把學習程式設計的過程看作是乙個習武的過程,如果你只有一點三腳貓的拳腳功夫,那出門你一定會 死 的很慘,所以在這個過程中你一定要通過研修一些武...

細數PHP中的那些魔術方法

created by phpstorm.user itboot date 2019 2 13 time 14 36 魔術方法類 php中,程式在特定時間自動呼叫的方法,叫做魔術方法 class magic class magic 在類外呼叫受保護的以及私有的成員屬性時自動執行該方法 或者在呼叫不存在...

那些年的我們

1992年我小學畢業,小學的名稱叫四村小學,雖然曾經的四村小學已經不在了,但是他永遠在我們的心中。那個時代,我們沒有手機也沒有智慧型相機,拍照是一種奢侈的事情,只有畢業的時候才有機會拍照。2002年我初中畢業,初中的名稱叫四村中學,雖然曾經的四村中學已經改名了,但是留在四村中學的回憶還是那麼多。初中...