排序演算法(二)交換排序

2021-10-03 03:12:13 字數 2999 閱讀 1448

根據序列中兩個元素的關鍵字的大小比較結果交換兩個元素在序列中的位置

1、氣泡排序

基本思想

從前往後或者從後往前兩兩比較相鄰元素的值,如果為逆序(與事先規定順序:遞增/遞減相反),交換兩個數的位置,從第一對到最後一對均完成交換,稱為一次冒泡,它會將整個序列裡最小的或者最大的元素換到第乙個或者最後乙個位置,一般結果將最小的元素交換到待排序序列的第乙個位置(關鍵字最小的元素如氣泡般向上漂浮,直至水面,這就是氣泡排序的由來)。下一次冒泡到來之時,已經排好的就不再參與冒泡了。最多n-1趟冒泡排好序。

#include

using

namespace std;

void

bubblesort

(int

* array,

int length)

;void

bubblesort1

(int

*array,

int length)

;int main ();

int length=10;

bubblesort

(array,length)

; cout<<

"result:"

;for

(int i=

1;i<=

10;i++

) cout<<<

" ";

cout

(array, length)

; cout<<

"result1:"

;for

(int i=

1;i<=

10;i++

) cout<<<

" ";

cout

}//最樸素的氣泡排序

void

bubblesort

(int

*array,

int length)}}

}//氣泡排序高階版

void

bubblesort1

(int

*array,

int length)}if

(flag==

false

)//本趟遍歷之後沒有發生交換,說明表已經有序

return;}

}

⚠️氣泡排序中所產生的有序子串行一定是全域性有序的(不同於直接插入排序),也就是有序子串行中的所有元素的關鍵字一定小於或大於無序子串行中所有元素的關鍵字,這樣每一趟排序都會將乙個元素放置在其最終的位置上。

氣泡排序效能分析

效能分析

時間最好:初始情況為有序,第一趟冒泡flag=false,比較次數n-1,交換次數0,時間複雜度o(1); 最壞:初始情況為逆序,需要n-1趟排序,第i趟需要進行n-i次比較,每次比較都必須移動3次元素,時間複雜度o(n2);平均時間複雜度o(n2)

空間o(1)

穩定性穩定,其實取決於if中的設定有沒有=

適用性順序表

2、 快速排序

基本思想

基於分治法的思想,在整個序列中找到乙個元素作為基準元素pivot,然後通過一趟排序確定pivot的位置,使pivot左邊的所有元素都小於pivot,pivot右邊的元素都大於pivot,把pivot放置在最終屬於它的位置,然後便不再移動它。接下來是遞迴處理左邊序列和右邊序列的過程。

#include

using

namespace std;

void

quicksort

(int

*array,

int low,

int high)

;int

partition

(int

*array,

int low,

int high)

;int main ();

int length=10;

quicksort

(array,

1,length)

; cout<<

"result1:"

;for

(int i=

1;i<=

10;i++

) cout<<<

" ";

cout

}//注意演算法跳出的條件

void

quicksort

(int

*array,

int low,

int high)

}//快速排序演算法的效能主要取決於劃分操作的好壞,這裡假設每次都是以當前表中第乙個元素為pivot對錶進行劃分

//每次從後往前找,當數值比pivot大的時候繼續向前尋找,直到找到比pivot小的數或者low=high

//然後從前往後找,當數值比pivot小的時候繼續向後尋找,直到找到比pivot大的數或者low=high

intpartition

(int

*array,

int low,

int high)

//其實現在把low或者high傳入都可以,因為現在low=high

array[low]

=pivot;

return low;

}

快速排序效能分析(有待仔細演算)

⚠️提高演算法效率

當遞迴過程中劃分得到的子串行的規模較小時不使用遞迴而採用直接插入排序

選取乙個可以將資料中分的pivot(eg:從序列的頭尾及中間選取三個元素,再取這三個元素的中間值作為最終的pivot;隨機從當前表中選取pivot,這樣使得最壞的情況在實際排序中幾乎不會發生)

在最理想的情況下,也就是partition演算法可能做到最平衡的劃分中,得到的兩個子問題的大小都不可能大於n/2,在這種情況下,快速排序的執行速度大幅度提公升,此時時間複雜度為o(nlog2n)

快速排序平均情況下的執行時間與最佳情況下執行時間很接近,快速排序是所有內部排序演算法中平均效能最優的演算法

排序演算法(二)交換排序

應用交換排序基本思想的主要排序方法有 氣泡排序和快速排序。一.氣泡排序 小數上浮,大數下沉 將被排序的記錄陣列r 1.n 垂直排列,每個記錄r i 看作是重量為r i key的氣泡。根據輕氣泡不能在重氣泡之下的原則,從下往上掃瞄陣列r 凡掃瞄到違反本原則的輕氣泡,就使其向上 飄浮 如此反覆進行,直到...

排序演算法 交換排序

交換排序的基本思想 兩兩比較待排序元素的關鍵字,發現兩個元素的次序相反時則進行交換,直到沒有反序的元素為止。1.氣泡排序 交換排序 演算法 氣泡排序 bubble sort 輸入 待排序元素的陣列,待排序元素個數 輸出 原理 通過無序區中相鄰元素間關鍵字的比較和位置的交換,使關鍵字最小的元素如氣泡一...

排序演算法 交換排序

基本思想 在乙個待排序序列中,兩兩比較元素的排序碼,如果不滿足次序要求則進行交換,直到整個排序序列滿足要求。思想 對待排序序列從前向後,依次比較相鄰元素的排序碼,若發生逆序,則進行交換。實現 include void bubblesort int p,int n if flag 減少不必要的比較 r...