随机选取枢纽元,根据枢纽元的值将数据分成两部分,大于枢纽元的集合和小于枢纽有的集合。之后分别在各个集合内做类似的处理。
需要注意的一些点:
- 枢纽元的选取
只是简单的选择第一个元素做枢纽是有风险的,如果输入随机,可以接受。
如果数据是正序或者逆序,所有元素都划分到一个集合。
可以采用的方法:
- 随机选取
- 三数中值分割法,左端、右端、中心位置三者之间的中值作为枢纽元
#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;
}