排序3
7.快速排序
快速排序采用分治法进行排序。基本思想为任取待排序的元素中的某个元素作为基准,按照该元素的排序码大小,将整个序列划分为两个子序列:左侧子序列中所有元素的排序码都小于基准元素的排序码,右侧子序列中所有元素的排序码都大于或等于基准元素的排序码,基准元素则排在这两个序列中间(这也是该元素最后安放的位置)。然后分别对这两个子序列重复施行上述方法,直到所有的元素都排在相应位置为止。
实现代码如下
#include<iostream>
using namespace std;
int ar[] = {2,4324,65,21,45,57865,4,7,1,0};
int Partition(const int low, const int high);
void QuickSort(const int left, const int right)
{
if(left < right)
{
int pivotpos = Partition(left, right);
QuickSort(left, pivotpos-1);//分别对两个子序列进行排序
QuickSort(pivotpos+1, right);
}
}
int Partition(const int low, const int high)
{
int pivotpos = low;
int pivot = ar[low];
for(int i=low+1; i<=high; ++i)
{
if(ar[i]<pivot)
{
++pivotpos;//每次都可以给low所指的元素找到其在序列中的精确位置
if(pivotpos != i)
{
int j = ar[i];
ar[i] = ar[pivotpos];
ar[pivotpos] = j;
}
}
}
ar[low] = ar[pivotpos];
ar[pivotpos] = pivot;
cout<<"low = "<<low<<" high = "<<high<<" pivotpos = "<<pivotpos<<" ar["<<pivotpos<<"] = "<<ar[pivotpos]<<endl;
cout<<endl;
for(int i=0; i<sizeof(ar)/sizeof(ar[0]); ++i)
cout<<ar[i]<<" ";
cout<<endl;
return pivotpos;
}
int main()
{
for(int i=0; i<sizeof(ar)/sizeof(ar[0]); ++i)
cout<<ar[i]<<" ";
cout<<endl;
QuickSort(0, 9);
return 0;
}
运行效果
不积小流无以成江河