笔记

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

}