C++ 快速排序算法
快速排序算法最壞的時間復雜度時o(n*n),期望的運行時間為o(nlgn)。
邏輯分析:
1 先從數組中選取一個數作為基數,可隨機選擇;
2 將數組中大于該基數的放在該基數右邊,小于該基數的放在該基數左邊;
3對左右兩個數組重復第二步。
代碼分析
數組a[]={2,1,4,5,3,8,7,9,0,6},該數組第一次分區時,left=0,right=10,假設隨機基數為a[4]=3。
首先將a[0]和a[4]互換位置,數組a[]={3,1,4,5,2,8,7,9,6,0}。
進行第一次分區:
? ? ? ? ? ? ? ? ? i=0,j=0時,j=left,數組沒有改變沒有改變。
? ? ? ? ? ? ? ? ? i=0,j=1時,a[j]=1<a[left]=3,故交換a[++i]和a[j]的位置,++i=1,故此時數組依然沒有變化。
? ? ? ? ? ? ? ? ? i=1,j=2時,a[j]=4>a[left]=3,此時數組仍然沒有變化。
? ? ? ? ? ? ? ? ? i=1,j=3時,a[j]=5>a[left]=3,此時數組仍然沒有變化。
? ? ? ? ? ? ? ? ? i=1,j=4時,a[j]=2<a[left]=3,故交換a[++i]和a[j]的位置,++i=2,數組a[]={3,1,2,5,4,8,7,9,6,0}。
? ? ? ? ? ? ? ? ? i=2,j=5時,a[j]=8>a[left]=3,此時數組仍然沒有變化。
? ? ? ? ? ? ? ? ? i=2,j=6時,a[j]=7>a[left]=3,此時數組仍然沒有變化。
? ? ? ? ? ? ? ? ??i=2,j=7時,a[j]=9>a[left]=3,此時數組仍然沒有變化。
? ? ? ? ? ? ? ? ? i=2,j=8時,a[j]=6>a[left]=3,此時數組仍然沒有變化。
? ? ? ? ? ? ? ? ? i=2,j=9時,a[j]=0<a[left]=3,故故交換a[++i]和a[j]的位置,++i=3,數組a[]={3,1,2,0,4,8,7,9,6,5}。
? ? ? ? ? ? ? ? ? i=3,跳出循環,交換a[i]和a[left]的位置,數組a[]={0,1,2,3,4,8,7,9,6,5。
#include<iostream> #include<cstdlib>using namespace std;//交換a,b的值,注意如果漏掉&,結果不正確 void swap(int &a, int &b) {int temp = a;a = b;b = temp; }//分區 若a[j]<基數,則將a[j]的值和a[++i]交換 int partition(int a[], int left, int right) {int i = left;for (int j = left; j < right; j++){if (a[j] < a[left]){swap(a[++i], a[j]);}}swap(a[i], a[left]);return i; }//快速排序 用隨機法選取任意一個數(數組內)作為基數,并將該數與a[left]互換 //遞歸方式,對分區數組再進行劃分 void quickSort(int a[], int left, int right) {if (left < right){int i = left + rand() % (right - left);swap(a[i], a[left]);int mid = partition(a, left, right);quickSort(a, left, mid);quickSort(a, mid + 1, right);}}int main() {int a[] = { 2,1,4,5,3,8,7,9,0,6 };quickSort(a, 0, 10);for (int i = 0; i < 10; i++){cout << a[i] << "";}cout << endl;system("pause");return 0;}?
總結
以上是生活随笔為你收集整理的C++ 快速排序算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 刮油最狠的四种减肥食物
- 下一篇: C++插入排序算法