问一个简单的快速排序的问题,关于处理重复元的方法
#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没有停止在基准元上。所以,这个地方该怎么写呢?谢谢!
...全文
相关推荐
Python简单实现查找一个字符串中最长不重复子串的方法
这个问题可以通过多种方法解决,这里介绍的是一种简单的实现方式。首先,我们需要定义一个函数`find_longest_no_repeat_substr`,它接受一个字符串`one_str`作为参数。
简单的快速排序
在Java中实现快速排序,我们需要定义一个方法来执行这个过程。
问题背后的问题 重复是最好的学习方法
【标题】"问题背后的问题 重复是最好的学习方法"揭示了一个重要的学习理念,即通过反复实践和探索来深化理解和掌握知识。
postgresql分页数据重复问题的深入理解
**调整work_mem设置**:根据数据库的实际情况调整`work_mem`参数,使得系统能够在内存中处理更多的数据,从而可能使用更快的排序方法。4.
Python实现快速排序算法及去重的快速排序的简单示例
它的基本思想是分治策略,通过选取一个基准值并进行分区操作,将问题分解为更小的部分,然后递归地对这些部分进行排序,最终合并得到完整的排序结果。在Python中,实现快速排序的代码简洁易懂。


