快速排序,左边判断条件加不加等于号?

1、快排的思想

选定一个基准元素,通过与基准元素的比较和交换,把待排序序列分为**小于基准元素的区域**和**大于或等于基准元素的区域**。(意思个人理解是切成两边,左边的值一定都是小于,右边的值大于或等于)。

2、代码:

var dataArray = [5, 2, 5, 2,70, 6, 4, 44, 5, 6];
function quickSort1(data, left, right) {
    if (left > right) {
        return;
    }
    var i = left;
    var j = right;
    var key = data[left];
    while (true) {
        // 先从右边找小值
        while (i < j && data[j] >= key) {
            j--;
        }
        data[i] = data[j];
        // while (i < j && data[i] < key) {
        // 加上等于号的判断
        while (i < j && data[i] <= key) {
            i++;
        }
        data[j] = data[i];
        if (i === j) {
            data[i] = key;
            break;
        }
    }
    // quickSort1(dataArray, left, i - 1);
    // quickSort1(dataArray, i + 1, right);
}
console.log(dataArray);
quickSort1(dataArray, 0, dataArray.length - 1);
console.log(dataArray);

3、网上有些代码它在做左边找“大值”的时候,相等的会放过去,使得第一次排序的结果如下,它的左边会出现不小于"5"的出现。这样是不是不太符合,它思想的定义的???

4、不加等于号,它就完全符合思想。虽然结果都是正确的,能不能认为“不加等于号”,会更好点???

阅读 2.4k
2 个回答

快速排序是分成两边,分而治之的思想,并没有规定以哪个为阈值,哪边去等于阈值,这也不重要。它是一种思想,思想并不能左右代码必须如何去实现

可以了解一下普通的快排(不专门处理和pivot相等的数据),三路快排(数据中相等的数据很多,用普通快排影响效率,所以用三路,左边小于pivot,中间等于pivot,右边大于pivot),至于你考虑的是不是要加等号,对于普通快排来说不重要,也不关心。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题