问一个简单的快速排序的问题,关于处理重复元的方法

yuxi1989 yuxi1989 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

#include <iostream>
#include <vector>

using namespace std;

int quicksort (vector<int>::iterator i, vector<int>::iterator j)
{
if (i>=j)
return 0;
else
{
int pval;
int a=*i, b=*(i+(j-i)/2), c=*j;
if (a<b && b<c)
pval=b;
else if (a<b && c<a)
pval=a;
else
pval=c;
vector<int>::iterator m=i, n=j;
while(m<n)
{
while (*m<pval)
m++;
while (*n>pval)
n--;
if (m<n)
swap(*m,*n);
}
quicksort(i,m-1);
quicksort(m+1,j);

}
}

int main()
{
vector<int> a;
for (int i=0;i<7;i++)
{
int tmp;
cin>>tmp;
a.push_back(tmp);
}
quicksort(a.begin(),a.end()-1);
for (int i=0;i<a.size();i++)
cout<<a[i]<<endl;
return 0;
}

上面是我写的快速排序算法,问题是,当有重复元素时,就死循环了。比如1,2,3,4,5,3,6,选择3作为基准元,则m=2,n=5(对应元素都是3),这个时候就不停的交换两个3,m、n也不变化,就死循环了。请问如何改进呢?
有的书上写先m++、n--然后再while,但感觉也不对。当m=2,n=5时,交换元素,变为1,2,3,4,5,3,6,然后m++、n--,则m=3(指向4),n=2(指向3)停止。但此时递归的调用就不对了,因为m没有停止在基准元上。所以,这个地方该怎么写呢?谢谢!
...全文

相关推荐

评论 7
收藏 已收藏
分享
返回顶部
yuxi1989
数据结构与算法 33,026 成员 35,334 内容