这个算法与C语言数据结构是的有所不同,不过性质一样都是采用分治法来实现的
平均时间复杂度为O(nlgn) ,最坏为O(n^2)
主要思想就是维持两个区间,左区间的元素小于mid,右区间则反之,对区间元素进行处理
void QuickSort(vector <int> & v, int low, int high)
{
int temp;
if(low <high)
{
int midPos=low;
int mid=v[low];
//每次循环目的是为了在[low, high]区间确定里v[low]的位置,
//始终维持两个区间左区间(小于v[low]),右区间(大于v[low])
//即midPos划分出左区间[low+1,midPos]和右区间[midPos+1,high]两部分,递归分治将大的区间分成小区间
//midPos所指向的位置永远是在左区间的第后个元素,也是最终v[low](mid)排序后的位置
for(int i=low+1;i <=high;++i)
{
//如果v[i]> =mid,即该元素为属于右区间即大于mid的区间,直接将i=i+1,midPos值不变,可以知道在[midPos+1,i]区间元素为右区间
//v[i] <mid里则v[i]应该不属于右区间中(然而我们必须得维持[midPos+1,i]为右区间),利用交换v[i]与v[midPos+1]的值(v[midPos+1]为右区间的第一个元素)并且将midPos=midPos+1(使midPos再次指向左区间的未端),这样保证[low+1,midPos]为左区间,[midPos+1,i]为右区间,通过交换同时把小于mid的v[i]元素放入[low+1,midPos]中
if(v[i] <mid && ++midPos!=i) //避免是相等的时候
{
temp=v[i];
v[i]=v[midPos];
v[midPos]=temp;
}
}
//循环结束后,区间[low+1,high]划分成[low+1,midPos],[midPos+1,high],这样递归直到每个区间只剩下两元素
//一次递归只是将v[low]元素值的位置确定了下来,并以midPos为划分点,在其左边的所有元素值一定比它小,
//右边所有的元素都比它大,所以v[low]排序后位置通过一次循环就固定了
//处理v[low],将其与midPos元素的位置交换就行,这就是v[low]排序后的位置
temp=v[low];
v[low]=v[midPos];
v[midPos]=temp;
//完成以对v[midPos]位置的排序后,对子区间进行分而治之...
QuickSort(v, low, midPos-1); //对左区间[low,midPos-1]进行递归
QuickSort(v, midPos+1, high);//对右区间[midPos+1,midPos+1]进行递归
}
}
QuickSort分析,这是回复提问时碰到的,顺便对学过的算法进行复习,总结...
最新推荐文章于 2024-08-14 12:02:23 发布