我遇到了快速排序算法的问题

时间:2017-08-11 12:39:41

标签: arrays algorithm sorting quicksort

Quicksort算法存在问题。我已经在互联网上阅读了关于它的不同页面,也包括维基百科。但他们没有详细解释太多。 当你选择最后一个元素作为枢纽时,我已经理解了他们的例子。在这种情况下,您选择另外两个变量i,其中j将遍历数组,直到它找到一个大于pivotelement的元素和i,j,直到它找到一个低于the的元素主元。找到后,我们切换显示i,j的元素,然后继续......

我的问题是,您首先选择哪个元素1?我们假设我们已经给出了这个数组,而关键元素是i

9 1 4 2 0 7

我的j是什么,我的i是什么?

我认为第一个元素是9,所以j  而7是数组中的最后一个元素,所以OBS .buffer(SUB) .withLatestFrom(SUB) .map(([buffer, t]) => { if(!buffer || !buffer.length) { return null; } if(t === T) { return buffer[buffer.length - 1]; } return null; }) .filter((e) => !!e);

2 个答案:

答案 0 :(得分:1)

维基百科很好地解释了它:

  

C.A.R.描述的原始分区方案。霍尔使用两个   那么从被分区的数组的末尾开始的索引   相互移动,直到他们发现反转

所以答案是肯定的,将i设置为第一个和j到数组的最后一个元素并将它们移动直到它们相遇,这是quicksort算法的分区部分的基础。

每当您不确定时,最好检查确切的代码。有几种变体,你可以找到一个,例如here

function quicksort(array)
    if length(array) > 1
        pivot := select any element of array
        left := first index of array
        right := last index of array
        while left ≤ right
            while array[left] < pivot
                left := left + 1
            while array[right] > pivot
                right := right - 1
            if left ≤ right
                swap array[left] with array[right]
                left := left + 1
                right := right - 1
        quicksort(array from first index to right)
        quicksort(array from left to last index)

如您所见,leftright(相当于您的ij)被设置为数组的第一个和最后一个索引。

答案 1 :(得分:1)

你可以做的是分别从(0)和(列表长度 - 1)开始。

SPOILER(如果您不想在JavaScript中使用解决方案,请不要阅读下面的代码或点击链接,并且宁愿使用我在第一个声明中提供的信息自行解决这个问题。)

在JavaScript here中查看我的快速排序算法。

以下是仅供将来参考的示例:

function quicksort(items, left, right) {
    if (items.length > 1) {
        left = typeof left !== 'number' ? 0 : left;
        right = typeof right !== 'number' ? items.length - 1 : right;

        let index = partition(items, left, right);

        if (left < index - 1) {
            quicksort(items, left, index - 1);
        }

        if (index < right) {
            quicksort(items, index, right);
        }
    }

    return items;
}

function swap(items, firstIndex, secondIndex) {
    let temp = items[firstIndex];
    items[firstIndex] = items[secondIndex];
    items[secondIndex] = temp;
}

function partition(items, left, right) {
    let pivot = items[Math.floor((right + left) / 2)],
        i = left,
        y = right;

    while (i <= y) {
        while(items[i] < pivot) {
            i++;
        }

        while(items[y] > pivot) {
            y--;
        }

        if (i <= y) {
            swap(items, i, y);
            i++;
            y--;
        }
    }

    return i;
}

let arr = [10, 3, 7, 5, 9, 2, 8, 1, 6, 4];

console.log(quicksort(arr)); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]