Sort排序專題(5)快速排序(QuickSort)(C++實現)
快速排序(QuickSort)
快速排序:快速排序(Quicksort)是對氣泡排序的一種改進。
思想:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。
圖解如下:
①以陣列第一個元素49作為參考,比他大的放到他的右邊,比他小的放到他的左邊。
②分別對其左右兩邊依次進行①的操作,進行遞迴。
③重複迴圈進行①②操作。
程式碼實現
#include<bits/stdc++.h>
using namespace std;
void QuickSort(int *arr,int l,int r)
{
if(arr == NULL || l >= r) return ;
int lid = l,rid = r,Tmp;
while(lid < rid) //選出arr[l]作為標準參考元素
{
while(lid < rid && arr[rid] >= arr[l]) rid--; //從右往左找第一個比參考元素小的值位置
while(lid < rid && arr[lid] <= arr[l]) lid++; //從左往右找第一個比參考元素大的值的位置
Tmp = arr[lid]; //交換arr[lid]和arr[rid],交換上面找到的兩個元素的位置
arr[lid] = arr[rid]; //當使用異或進行值的交換時候必須保證兩個數不為同一個數。
arr[rid] = Tmp;
}
Tmp = arr[lid]; //交換arr[l]和arr[lid]位置,交換參考元素和交換後的lid位置
arr[lid] = arr[l]; //交換完了就實現了參考元素左邊都是小於其值,右邊都是大於其值的
arr[l] = Tmp;
QuickSort(arr,l,lid-1); //遞迴實現參考元素左邊的有序化
QuickSort(arr,lid+1,r); //遞迴實現參考元素右邊的有序化
}
int main()
{
int *arr = NULL; //指標==陣列 指標需要初始化
int n,len;
cin>>n;
arr = (int*)malloc(sizeof(int)*n); //指標使用需要malloc空間(malloc空間虛擬地址連續,實體地址不一定連續)
for(int i = 0; i < n; i++)
{
cin>>arr[i];
}
QuickSort(arr,0,n-1);
for(int i = 0; i < n; i++)
{
cout<<arr[i]<<" ";
}
free(arr);
arr = 0;
return 0;
}
時間複雜度
快速排序的一次劃分演算法從兩頭交替搜尋,直到L和R重合,因此其時間複雜度是O(n);而整個快速排序演算法的時間複雜度與劃分的趟數有關。
理想的情況:每次劃分所選擇的中間數恰好將當前序列幾乎等分,經過log2n趟劃分,便可得到長度為1的子表。這樣,整個演算法的時間複雜度為O(nlog2^n)
最壞的情況:每次所選的中間數是當前序列中的最大或最小元素,這使得每次劃分所得的子表中一個為空表,另一子表的長度為原表的長度-1。這樣,長度為n的資料表的快速排序需要經過n趟劃分,使得整個排序演算法的時間複雜度為O(n^2)。
快速排序的平均時間複雜度也是O(nlog2n)。因此,該排序方法被認為是目前最好的一種內部排序方法。
相關文章
- 快速排序(Quicksort)的Javascript實現排序UIJavaScript
- QuickSort 快速排序UI排序
- Sort排序專題(7)歸併排序(MergeSort)(C++實現)排序C++
- 快速排序(quicksort)演算法實現排序UI演算法
- 排序演算法之「快速排序(Quick Sort) _c++ 」排序演算法UIC++
- 快速排序(Quick Sort)排序UI
- 快速排序 (Quick Sort)排序UI
- Array.sort 演算法原理(插入排序\快速排序in-place實現)演算法排序
- 快速排序演算法C++實現排序演算法C++
- Sorting 排序演算法: Quick Sort 快速排序排序演算法UI
- 經典排序演算法 - 快速排序Quick sort排序演算法UI
- php實現 歸併排序,快速排序PHP排序
- 快速排序的三種實現方法 (C++)排序C++
- 【c++】結構體sort排序C++結構體排序
- 【轉】堆排序Heap Sort——Java實現排序Java
- 快速排序C++排序C++
- GO 實現快速排序Go排序
- 快速排序 java實現排序Java
- Swift實現快速排序Swift排序
- java實現快速排序Java排序
- 快速排序(java實現)排序Java
- 快速排序的實現排序
- Go實現氣泡排序和快速排序Go排序
- 排序sort排序
- sort排序排序
- C++快速排序與歸併排序的實現(LeetCode 912)C++排序LeetCode
- C++ partial_sort(部分排序)C++排序
- Array.sort排序問題排序
- 快速排序演算法(Quick_Sort)排序演算法UI
- .NET 排序 Array.Sort<T> 實現分析排序
- 排序演算法之快速排序的實現排序演算法
- 堆排序(實現c++)排序C++
- 堆排序c++實現排序C++
- 快速排序三種實現排序
- python實現快速排序Python排序
- 選擇排序和插入排序(C++實現)排序C++
- python排序演算法的實現-快速排序Python排序演算法
- 三種語言實現快速排序(C++/Python/Java)排序C++PythonJava