這裡的測試資料來自於之前自己隨便寫的生成器
#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 基本實...