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

2021-09-27 12:05:43 字數 1886 閱讀 7602

這裡的測試資料來自於之前自己隨便寫的生成器

#include

using namespace std;

intmain()

int t =

10, arr[20]

;while

(t--

)return0;

}

/*-----氣泡排序-----*/

void

bubblesort

(int arr,

int n)}if

(flag ==0)

return;}

}

氣泡排序

空間複雜度

使用常數個輔助單元,空間複雜度為o(1)

時間複雜度

最好情況:初始序列已經有序,遍歷一遍序列,比較了 n-1 次,沒有進行交換,時間複雜度為o(n)

最壞情況:初始序列為逆序序列,對於第 i 趟排序,都是將陣列的最後乙個元素放到陣列的第 i 個位置,比較次數為 n-i 次。n-1 趟排序一共比較了∑ (n-i) = n*(n-1)/2 次,時間複雜度為o(n²)

平均情況:時間複雜度為o(n²)

穩定性

該演算法從後往前找大於(或小於)的位置,不存在相同元素之間位置交換,因此是穩定

/*-----快速排序-----*/

intpartition

(int arr,

int low,

int high)

;//函式宣告

void

quicksort

(int arr,

int low,

int high)

}int

partition

(int arr,

int low,

int high)

arr[low]

= pos;

//再把分割點的值放回來

return low;

//返回分割點的下標

}

快速排序

演算法思想

基於分治法,每一趟排序用序列的第乙個元素(即為pos)將序列分成左右兩個子串行,子串行不要求有序,只需要保證左子串行中的所有值比pos小、右子串行中的所有值比pos大 即可。

對左右兩個子串行再進行遞迴快速排序,分割。

空間複雜度

遞迴演算法需要借助遞迴工作棧來儲存資訊,容量和遞迴呼叫深度一致

最好情況:為log₂(n+1) 取上界

最壞情況:o(n)

平均情況:o(log₂n)

時間複雜度

每趟排序都是將序列分割成左右兩個子串行,因此可得到遞推公式

t(n) = 2t(n/2) + o(n)

最好情況:每次partition都平均分成兩部分,時間複雜度為o(nlogn)

最壞情況:按照遞推公式計算,可得時間複雜度為o(n²)

平均情況:時間複雜度為o(nlogn)

穩定性

左右序列交換過程中,相同元素的相對位置可能會發生改變,因此是不穩定

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

通過對比大小交換對比的元素所得到的排序為交換排序。冒牌排序時很常見的 通過對比相鄰元素的大小如果前面的元素比後面的大,則交換兩個元素,使得大的元素往後移。一 氣泡排序 二 快速排序,本文重點 快速排序在一次排序中有兩個方向,乙個是從尾部向前 逆向 乙個是從首部標誌 不包括首部標誌 向後 正向 正向和...

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

1 氣泡排序演算法思想及實現 這是最原始,也是眾所周知的最慢的演算法了。基本思想 按待排序序列的先後順序,依次比較相鄰的兩個數,將小數放在前面,大數放在後面 若二者是公升序,則不作任何操作,否則交換兩個數即可 即在第一趟 首先比較第1個數和第2個數,將小數放前面,大數放後面。然後比較第2個數和第3個...

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

1.氣泡排序 1 演算法思想 將序列中的第乙個元素和第二個元素相比較,如前者大於後者,則交換,否則不交換 再將第二個元素和第三個元素比較,若前者大於後者,則交換兩個元素的位置,否則不交換,依次進行,直到最後乙個元素,經過如此一輪,則n個元素中最大的乙個被放在了最後。此後,再進行相同的過程。2 基本實...