快排遇到重复元素死循环的问题
笔记
好久没写快排的算法了,今天重新写了一遍快排,但是遇到了一个问题:数组中有重复数字会死循环。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]; } }