今天刷蓝桥杯题时,遇到了快速排序的算法,题目很简单,就是简单的不超过10个数字的快排,我很快的写完了一提交,正确率为90%。错误原因为超时。于是我在想总共就10个数字,怎么会超时呢,会不会时陷入了死循环。于是我检查代码。我觉得可能出现问题的循环就是快排中的i++和j--那块。有一想只有10%错误会不会是某种特殊情况。突然想到数组里有元素重复的情况。于是我简单的在<和>右面加上了“=”号,没想到运行结果大错特错。后来找到了原因。一旦遇到了重复的,会跳过两个循环执行交换代码。但是并没有更改i,j的值,于是就陷入了无限交换中。于是我就想到了应该在交换以后更改i或j的值。但是我又不知道是哪个循环导致的交换,不知道该修改i还是j。于是我就在两个while的后面分别加上了交换语句。下面是代码:
#include <iostream>
using namespace std;
int ch[10];
int n;
int quicksort(int low,int high)
{
int x = ch[low];
int i=low;
int j=high;
while(i!=j)
{
while(x<=ch[j]&&i<j)
j--;
if (i<j){
int temp = ch[i];
ch[i]=ch[j];
ch[j]=temp;
i++;
}
while(x>=ch[i]&&i<j)
i++;
if (i<j){
int temp = ch[i];
ch[i]=ch[j];
ch[j]=temp;
j--;
}
}
return i;
}
void quick(int low,int high)
{
if(low>high)
return;
int mid = quicksort(low,high);
quick(low,mid-1);
quick(mid+1,high);
}
int main(int argc, char** argv) {
for(int i=0;;i++)
{
int temp;
scanf("%d",&temp);
if(temp==0)
{
n=i;
break;
}
else
ch[i]=temp;
}
quick(0,n-1);
for(int i=0;i<n;i++)
cout<<ch[i]<<" ";
}
下面是两个小例子 因为原本的题目要求是输入几个数组 空格分开 以0结尾 0不计入
/*
5 2 6 1 7 3 4 0
5 2 6 1 7 3 4 4 0
*/
本文介绍了在实现快速排序算法时遇到数组包含相同元素导致超时的问题。作者通过分析发现,当遇到相等元素时,未正确处理i和j的值,导致无限循环。解决方案是在交换元素后更新i或j,以确保排序的正确进行。提供了修正后的代码,并附带了测试用例。
966

被折叠的 条评论
为什么被折叠?



