排序演算法 交換排序(氣泡排序 快速排序)

2021-09-10 22:35:28 字數 3691 閱讀 7813

交換排序:利用交換資料元素位置的方法進行排序的方法

基本思想:將序列中第乙個記錄與第二個記錄比較,若前乙個大於後乙個,則交換位置。然後比較第二個和第三個,第三個和第四個,以此類推,一輪之後,序列中最大的元素就到了序列最後的位置上。繼續進行第2輪,第3輪,第n-1輪。若其中某一輪途中沒有元素交換,則證明序列已經排好序,後面的輪次不需要再進行。氣泡排序是穩定的排序。

排序過程如圖所示:

cout << "排序前:";

for (int i = 0; i < length; i++)

cout << endl;

int *p = bubblesort(a,length);

cout 空間複雜度:ο(1)

時間複雜度:ο(n^2)

快速排序又叫分割槽交換排序,它是對氣泡排序的一種改進,是目前已知排序方法中最快的一種。

基本思想:從待排序的序列中選取乙個元素r(一般選取第乙個)作為標準,調整所有記錄的位置,使得r之前的記錄均小於r,r之後的記錄均大於r,即乙個快速排序之後,r被放到了最終的位置上。同時,r把原序列劃分為兩個子串行,對兩個子串行繼續使用該方法,直到所有子串行的長度為1時排序完成。快速排序是乙個遞迴的過程。快速排序是不穩定的排序。

排序過程圖示:

//快速排序

//分割(單次快排,尋找標準元素的位置)

int partition(int a, int low, int high)

//將小於標準元素的資料往前放

if (a[high] < temp)

while (low < high && a[low]<=temp)

//將大於標準元素的資料往後放

if (a[low] > temp)

} a[low] = temp; //標準元素移動到正確的位置

return low; //返回標準位置

}//快速排序

//排序

void qsort(int a, int low, int high)

cout << endl;

qsort(a, low, standardlocation-1);

qsort(a, standardlocation+1, high); }

}int * quicksort(int a, int length)

int main() ;

int number = 3;

int d[3] = ;

cout << "排序前:";

for (int i = 0; i < length; i++)

cout << endl;

int *p = quicksort(a, length);

cout << endl << "排序後:";

for (int i = 0; i < length; i++)

system("pause");

return 0;

}空間複雜度:ο(n)

時間複雜度:ο(nlog_2⁡n)

時間複雜度:快速排序的時間複雜度取決於標準記錄的選擇。

a.最快的情況

如果每次選的標準記錄都是中間數,則序列總是被分為長度基本相等的子串行。若完成n個記錄排序所需時間為t(n),則有:

其中k表示分解的次數,這種情況下分解過程可以描述為一顆滿二叉樹,分解的次數為樹的深度log_2⁡n。所以有:

b.最壞的情況

如果每次選擇的記錄都是當前序列的最小數,則總是把序列分為乙個空子序列和乙個長度為原長度減一的子串行,這時,總比較次數為:

若原始記錄時已經排好序(與要求的順序相反)的序列,且每次選取的是第乙個作為標準元素,快速排序則變成了時間複雜度為ο(n^2)的慢排序。但是一般情況下,待排序的是隨機的,所以快速排序的平均比較次數為ο(nlog_2⁡n),由於快速排序元素的移動次數和比較次數相比少很多,故快速排序的時間複雜度為ο(nlog_2⁡n)

空間複雜度:遞迴式快速排序需要環境棧儲存分割點,棧的深度最好情況下為log_2⁡n,最壞情況下為n,因此快速排序的空間複雜度為o(n)。

快速排序不穩定性舉例

例如(5,3a,6,3b)對這個進行排序,排序之前相同的數3a與3b,a在b的前面,經過排序之後會變成

(3b,3a,5,6),所以說快速排序是乙個不穩定的排序

用堆疊儲存中間資料,代替遞迴。棧結構可以用陣列模擬

#includeusing namespace std;

//快速排序

//分割(單次快排,尋找標準元素的位置)

int partition(int a, int low, int high)

//將小於標準元素的資料往前放

if (a[high] < temp)

while (low < high && a[low]<=temp)

//將大於標準元素的資料往後放

if (a[low] > temp)

} a[low] = temp; //標準元素移動到正確的位置

return low; //返回標準位置

}//快速排序—非遞迴形式

int * quicksort_nonrecursive(int a, int length)

if(par < high-1)

//出棧

while(top > 0)

if(par < high-1)

} return a;

}int main() ;

int number = 3;

int d[3] = ;

cout << "排序前:";

for (int i = 0; i < length; i++)

cout << endl;

int *p = quicksort_nonrecursive(a, length);

cout << endl << "排序後:";

for (int i = 0; i < length; i++)

system("pause");

return 0;

}

十大排序演算法對比與總結

參考部落格:

交換排序 氣泡排序,快速排序

交換排序 氣泡排序,快速排序 執行環境 vs2010 include include include include define ok 1 define true 1 define false 0 define maxsize 50 typedef struct redtype typedef s...

交換排序(快速排序 氣泡排序)

1.快速排序 先從數列中取出乙個數作為基準數 分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊 再對左右區間重複第二步,直到各區間只有乙個數。以乙個陣列作為示例,取區間第乙個數為基準數。0 1 2 3 4 5 6 7 8 9 72 6 57 88 60 42 83 73 4...

交換排序(氣泡排序,快速排序)

氣泡排序演算法 顧名思義,就是將最重的 最大元素 浮動到最下面,最輕的 最小元素 浮動到最上面 演算法過程 1.迴圈陣列長度length 1次,下標為 因為每次迴圈後就會出現乙個最大 公升序 或最小 降序 只需要比較n 1就行 1.1 在前 length i個元素中迴圈因為已經有i個已經有序 1.1...