快速排序遇到数组内含相同元素时的解法

本文介绍了在实现快速排序算法时遇到数组包含相同元素导致超时的问题。作者通过分析发现,当遇到相等元素时,未正确处理i和j的值,导致无限循环。解决方案是在交换元素后更新i或j,以确保排序的正确进行。提供了修正后的代码,并附带了测试用例。

今天刷蓝桥杯题时,遇到了快速排序的算法,题目很简单,就是简单的不超过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

*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值