C++ 中的 QuickSort 无法完成排序

Posted

技术标签:

【中文标题】C++ 中的 QuickSort 无法完成排序【英文标题】:QuickSort in C++ will not finish sorting 【发布时间】:2015-03-14 15:42:24 【问题描述】:

有人可以帮我告诉我为什么快速排序算法不会对最终元素进行排序吗? 当我输入: 6 89 2 78 12 19 99 43 7 63 我得到了几乎排序: 2 6 7 12 78 19 43 99 63 89

我试图弄清楚我自己,但是当我按照自己的方式工作时,有时我会在进行桌面检查时迷失方向。

#include <iostream>
using namespace std;

// function prototypes
void quickSort(int arrayList[], int left, int right);
int choosePivot(int arrayList[], int listSize);
int partition(int array[], int left, int right);
void printArray(int theArray[], int Size);
// void swap(int value1, int value2);

int main()

    int myList[] = 6, 89, 2, 78, 12, 19, 99, 43, 7, 63;
    printArray(myList, 10);
    quickSort(myList, 0, 9);
    printArray(myList, 10);

    //int myList2[] =  7, 4, 9, 10, -9 ;
    //printArray(myList2, 5);
    //quickSort(myList2, 0, 5);
    //printArray(myList2, 5);


    cin;
    getchar;
    getchar;

    return 0;



void quickSort(int arrayList[], int left, int right)

    //if (left < right)
    if(right > left)
    
        int p = partition(arrayList, left, right);

        printArray(arrayList, 10);
        quickSort(arrayList, left, p-1);
        quickSort(arrayList, p + 1, right);
    


// left (index value) - left most part of the array we are working on
// right (index value) - right most part of the array we are working on
int partition(int array[], int left, int right)

    //int pivot = array[left]; // I will have to write a function to find the
    //  optimum pivot point, this is the naive solution
    int pivot = array[(left+right)/2];


    int i = left;
    int j = right;
    int temp;
    while (i < j)
    
        //cout << "in the loop" ;
        while (array[i] < pivot)
            i++;
        while (array[j] > pivot)
            j--;
        if (i < j)
        
            temp = array[i];
            array[i] = array[j];
            array[j] = temp;
            i++;
            j--;
        
    

    return i;


void printArray(int theArray[], int Size)

    for (int i = 0; i < Size; i++)
    
        cout << theArray[i] << " ";
    
    cout << endl ;

【问题讨论】:

“在某些时候我迷路了” 这不是很科学......你能想出一个比“请帮我完成这个调试”更具体的问题吗 忘记桌面检查,单步调试调试器中的代码,以便了解实际情况... 【参考方案1】:

您的partition() 函数中有一个错误(我认为它是Hoare partition 算法实现)。您只需要删除此代码:

        i++;
        j--;

交换值之后。

这里是更正后的partition()功能码:

int partition(int array[], int left, int right)

    int pivot = array[(left + right) / 2];
    int i = left;
    int j = right;

    while (i < j) 
        while (array[i] < pivot)
            i++;
        while (array[j] > pivot)
            j--;
        if (i < j) 
            int temp;

            /* Swap array[i] and array[j] */
            temp = array[i];
            array[i] = array[j];
            array[j] = temp;
        
    

    return i;

即使修复了这个错误,您也应该为您的quicksort 实现创建一个好的单元测试,因为可能还有其他一些细微的错误(从头开始编写partition() 的无错误实现非常困难)。在您的unit test 中检查edge cases, corner cases and boundary cases。

【讨论】:

【参考方案2】:

我不确定这会有多大帮助,但是当你得到你的支点时

(left + right) / 2

你正在做 (0+9) / 2 即 4。但问题是,如果数组的大小为 10,则中间应该是 5。

【讨论】:

1. 这无助于解决他的问题,而 2. 在这种情况下,中间不必是 5,它只是与 4 相同。在 pivot=4 的情况下,左侧有 4 个元素,右侧有 5 个元素。在 pivot=5 的情况下,左侧有 5 个元素,右侧有 4 个元素。

以上是关于C++ 中的 QuickSort 无法完成排序的主要内容,如果未能解决你的问题,请参考以下文章

基于 C++ 中的多个事物进行排序

快速排序(quickSort)

用C++交换排序

C ++快速排序算法崩溃[关闭]

小白初识 - 快速排序(QuickSort)

算法中的快速排序 quicksort