快排遇到重复元素死循环的问题

笔记

好久没写快排的算法了,今天重新写了一遍快排,但是遇到了一个问题:数组中有重复数字会死循环。
        while(start<end) {
            while(num[end]>i && end>start) {
                end--;
            }

            num[start] = num[end];
            while(num[start]<i && end >start) {
                start++;
            }

            num[end] = num[start];
        }

}

  思路
  这是一个很正常的快排算法,但是在输入的数组元素中有重复数字的时候会死循环,没有重复数据的数组可以正常排序。
  发现这个问题的原因是因为我处出于好奇在测试用例中多打了一个1。
  因为数组中有重复元素,因此在while到达一个num[end]<=i&&num[start]>=i&&num[start]==num[end]时会导致两个while指针都没有办法移动,只能互相不停赋值。
  解决方法
  原因是因为while判断时仅仅只要求基准数左边小于自身,而应该为小于等于自身,不然在等于自身的时候,程序默认判断需要将此位置换。

        while(start<end) {
            while(num[end]>=i && end>start) {
                end--;
            }

            num[start] = num[end];
            while(num[start]<=i && end >start) {
                start++;
            }

            num[end] = num[start];
        }

}
全部评论

相关推荐

大猪蹄子哥:1-谁教你这么写教育经历的……咱都这个学历了,很多公司要看本科、硕士,Gap Year的,你啪就给一个上大26届硕士,没了。 2-那堆奖学金揉成一行放最后得了,放前面显得你没技术自信,还是那句话,对于咱这个学历直接上重点,你这上半段看起来像个大专(无恶意 3-专业技能最好点出来细化方向,你熟悉的以太网是UDP还是TCP,是千兆还是万兆等等,多种信号处理……那你倒是说两个啊,后面空着干嘛,会的干嘛不讲 4-项目经历废话太多,描述不专业(怎么还有我,我们这种词),没有数据支撑(是婴儿还是巨人看不出来)。最后如果这些是真的XX项目、比赛,最好点出来,不然更显得像自学着玩的,或者说抄的(经典复现等于我做过 5-个人总结在咱这个分段没用
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务