隨機(jī)選取樞紐元,根據(jù)樞紐元的值將數(shù)據(jù)分成兩部分,大于樞紐元的集合和小于樞紐有的集合。之后分別在各個(gè)集合內(nèi)做類似的處理。
需要注意的一些點(diǎn):
- 樞紐元的選取
只是簡(jiǎn)單的選擇第一個(gè)元素做樞紐是有風(fēng)險(xiǎn)的,如果輸入隨機(jī),可以接受。
如果數(shù)據(jù)是正序或者逆序,所有元素都劃分到一個(gè)集合。
可以采用的方法:
- 隨機(jī)選取
- 三數(shù)中值分割法,左端、右端、中心位置三者之間的中值作為樞紐元
#include <iostream>
using namespace std;
int Partition(int *a, int left, int right) {
int temp;
temp=a[left];
while(left<right) {
while(left<right && a[right]>=temp)
--right;
a[left] = a[right];
while(left<right && a[left]<=temp)
++left;
a[right] = a[left];
}
a[left] = temp;
return left;
}
void QuickSort (int *a, int left, int right) {
int pivot;
if(left>=right)
return;
pivot = Partition(a, left, right);
QuickSort(a, left, pivot-1);
QuickSort(a, pivot+1, right);
}
void print_data(int *a,int size)
{
for(int i=0;i<size;i++)
{
if(i<size-1)
cout<<a[i]<<",";
else
cout<<a[i];
}
cout<<endl;
}
int main() {
cout << "Hello, World!\n";
int a[]={2,4,14,56,1,22,2,6,77,3,43,26,21};
cout<<"排序前:"<<endl;
print_data(a,13);
cout<<"排序后:"<<endl;
QuickSort(a,0,12);
print_data(a,13);
return 0;
}