排序(1) 冒泡,簡單選擇,快速,簡單插入

2021-06-26 17:52:24 字數 2148 閱讀 8895

排序是底層常用的演算法。整理下知識,以便以後複習。

1:氣泡排序算是最簡單的排序方法了,簡單易懂。從第乙個數開始,將每乙個數與它之後的數進行比較,然後將較大的數放在後面,依次迴圈比較,一輪比較結束後,最大的數就會被排放到最後,就像冒泡一樣,最大(最小)的數從底層擠到的最後面(最前)。後面就簡單了,排除已經排序好的數後(範圍-1),進行下一次迴圈即可。比較次數固定,交換次數不固定。

2:簡單選擇排序,這個排序也是相當容易理解的一種。對序列進行一次迭代,首先乙個指標指標向第乙個元素,然後開始比較指標所指元素與序列內所有元素,如果指標所指元素較大,則將指標指向較小的元素,一輪迴圈後,指標指向的元素就是此次迴圈的最小數,將最小數與第乙個位置的數進行交換,至此,第乙個數就是最小的數了。然後從第二個數開始,重複之前的動作。

兩個演算法在我看來思路相同,都是一輪迴圈比較,找出最大或最小的值,然後排除這個值以後,進行下一次迴圈。只是冒泡使用交換來確定最大最小元素。而選擇排序則使用額外指標(下標,臨時時變數都行)來指向最大最小的元素。

兩者最大區別可能就是乙個穩定,乙個不穩定。穩定則需要多次交換。兩種複雜度都為o(n~2)。但不穩定演算法效能要優於穩定演算法(交換次數少)。

選擇排序是不穩定的,因為每次交換都有可能打破原來相等物件的順序。比如:  6,8,6,7,3.。  第一次迴圈後,3和6會進行交換,第乙個6就會被排序到第二個6的後面,這就打破了順序。

氣泡排序是穩定的,由於是前乙個數與後乙個數進行比較。迴圈到一定階段,相等的數就會被排到一起,而相等的數之間是不進行交換的,還是按照原來的次序。

3.快速排序:這是一種相當常用的演算法,他使用的是一種遞迴的思想,將複雜問題簡單化。最簡單的排序就是1個數,這個就不需要排序(結束條件)。2個數進行排序,以第乙個數為基準,比他大的放後面。

這樣,將乙個序列的數按乙個基準(一般第一或最後乙個數)分為兩部分,前面的都比他小,後面的都比他大,然後對這兩個部分再次以相同方式進行劃分(以各自序列的第乙個最後乙個數為基準劃分)。依次遞迴,最後分到只有乙個數,則不需要劃分了,同時也排序完成了。

使用遞迴後,思路就簡單了,思路就是,劃分成兩部分a,b-------a,b分別遞迴劃分;

所以唯一要解決的問題就是如何劃分了。使用的方法是使用兩個指標分別指向頭部和尾部。從一頭開始查詢,定位到第乙個不符合要求的數。這時開始從另外一頭開始查詢,也定位到第乙個不符合要求的數。此時,兩個指標所指向的數都是不符合自己序列的數(大於,小於基準數),於是將兩個數進行交換,這樣,兩個數就都符合自己序列要求了。重複以上步驟,就這樣,兩個指標相向進行移動,疏通各自序列,保證序列符合要求。

結束迴圈的條件就是兩個指標指向同乙個數。

比較這個數和基準數,如果是屬於基準所在分序列要求的(比如,選取第乙個數字基準,則基準所在分序列要求是<=基準。反之則是》=基準),則交換此數與基準數。如果是不符合的,則將基準數交換成這個數附近符合基準序列的數(如果基準是第一,則選擇這個數之前的數,如果基準是最後,則選擇這個數之後的數)。總而言之,就是將基準數移動到序列中心。

至此,序列之前的數都小於基準,序列之後的數都大於基準數。

快速排序由於是兩個指標向著中心運動,第一次排序(未遞迴之前)就可能會導致相等元素位置反向,所以這是乙個不穩定的演算法。如9,6,6,1,7,4,3,2,5假設以5為基準,第一次2與9交換,第二次第乙個6與3交換,第三次第二個6與4進行交換,此時兩個相等的6順序顛倒了。

快速排序平均時間複雜度為o(nlogn),優於簡單選擇排序。

4.簡單插入排序:這也是一種比較容易理解和實現的演算法。它的思想是,將乙個元素插入到有序的元素序列中,形成的還是有序的序列。實現方式就是使用乙個數字n代表有序數列的值,初始為 1,也就是初始時只有乙個數是有序的,然後將第n+1(未排序數列的最開始的數)插入到前面的有序數列中,將n自增一。然後重複開始插入第n+1個數。

這個演算法每部迭代流程是  :找到插入位置---將數插入。

一般查詢插入位置,陣列使用二分查詢法相當快,鍊錶使用普通查詢。而插入的話,如果底層是陣列,則需要用乙個臨時值儲存需要插入的數,然後再插入位置之後的向後移動乙個位置直到需要插入的原始位置,最後替換插入位置的元素。比如   3,7,11,5,9。假設正在插入5,則7,11都要向後挪動乙個位置 變成 3,7,7,11,9。最後用5替換第三個位置的7。

如果底層是鍊錶的話,則可以取出這個節點,插入到相應位置。

底層為陣列時插入花銷大(需要後移元素),但是查詢快(二分)。而鍊錶則是插入相當快,但是查詢比較慢(可以通過使用二叉樹鍊錶來代替線性鍊錶,降低查詢時間)。

簡單選擇,冒泡,插入,快速排序之效率比較

這四種耳熟能祥的排序演算法,找了個時間自己去重寫研究了一遍,考察了他們的執行效率問題。當然對於一些初級的程式設計師千萬別在拿著選擇排序當氣泡排序的用了。所有的排序都是根據自己對排序思想的理解後編寫的,如有不正確的地方還請提出。簡單選擇排序 每次從陣列序列中選擇乙個元素與其他所有元素進行比較,每趟可以...

氣泡排序and簡單選擇排序

在第一趟排序中,從第乙個元素開始,掃瞄整個待排序元素序列,若相鄰的兩個元素逆序,則交換位置。直到最後乙個元素,此時,最後乙個元素必為最大的元素。第二趟排序,依然從第乙個元素開始掃瞄直到倒數第二個元素。第三趟排序,從第乙個掃瞄到倒數第三個。直到只剩乙個元素需要掃瞄。程式如下 includeint ma...

簡單排序 氣泡排序 簡單選擇排序 插入排序)

氣泡排序 氣泡排序,掃瞄len次,每次用下標0掃瞄到len 1 i,比較相鄰的兩個元素並交換 param num param len void bubblesort int num,int len cout b 簡單選擇排序 簡單選擇排序 掃瞄len次,每次從下標i掃瞄到len 1,每次掃瞄找到乙個...