标签:right int nleft pivot 排序 快速 left
**快速排序**
快速排序的基本思想:
首先选第一个数作为分界数据,
将比它小的数据存储在它的左边,比它大的数据存储在它的右边,它存储在左、右两个子集之间。
这样左、右子集就是原问题分解后的独立子问题。
再用同样的方法,继续解决这些子问题,直到每个子集只有一个数据,就完成了全部数据的排序工作。
利用快速排序算法的思想,来解决选择问题。
记一趟快速排序后,分解出左子集中元素个数为 nleft,则选择问题可能是以下几种情况之一:
nleft =k﹣1,则分界数据就是选择问题的答案。
nleft >k﹣1,则选择问题的答案继续在左子集中找,问题规模变小了。
nleft <k﹣1,则选择问题的答案继续在右子集中找,问题变为选择第k-nleft-1 小的数,问题的规模变小了。
此算法在最坏情况时间复杂度为 O(n2) ,此时nleft总是为0,左子集为空,即第k小元素总是位于right子集中。
平均时间复杂度为 O(n )。
int select (int left, int right, int k){
if(left>=right) return a[left];
int i=left; int j=right+1;
int pivot=a[left];
while(true){
do{ i=i+1;}while(a[i]<pivot);
do{ j=j-1;}while(a[j]>pivot);
if(i>=j) break;
swap(a[i],a[j]);
}
if(j-left+1==k) return pivot;
a[left]=a[j];
a[j]=pivot;
if(j-left+1<k) //j-left+1 :左区元素的个数
return select(j+1,right,k-j+left-1); //在右区中找
else
return select(left,j-1,k);
}
标签:right,int,nleft,pivot,排序,快速,left 来源: https://blog.csdn.net/qq_45356160/article/details/102760081
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。