C++ 快速排序代码没有';我不能正常工作 intmain() { 整数[大小]={14,7,23,31,1,20,6,3,40,5},开始,结束; 不能

C++ 快速排序代码没有';我不能正常工作 intmain() { 整数[大小]={14,7,23,31,1,20,6,3,40,5},开始,结束; 不能,c++,quicksort,C++,Quicksort,而不是 int main() { int numbers[size] = {14, 7, 23, 31, 1, 20, 6, 3, 40, 5}, start, finish; cout << "Numbers are: " << endl; for (int i = 0; i < size; i++) { cout << numbers[i] <&l

而不是

int main()
    {
        int numbers[size] = {14, 7, 23, 31, 1, 20, 6, 3, 40, 5}, start, finish;

        cout << "Numbers are: " << endl;
        for (int i = 0; i < size; i++)
        {
            cout << numbers[i] << "\t";
        }

        finish = 10;
        start = 0;

        quickSort(numbers, start, finish);

        cout << "\n\nSorted: " << endl;
        for (int j = 0; j < size; j++)
        {
            cout << numbers[j] << "\t";
        }

        return 0;
    }

int Partition(int numbers[], int start, int finish)
{

    int pole = start;
    int pivot = numbers[finish];

    for (int k = 0; k < finish - 1; k++)
    {
        if (numbers[k] <= pivot)
        {
            int temp = numbers[k];
            numbers[k] = numbers[pole];
            numbers[pole] = temp;

            pole++;
        }
    }

    int temp2 = numbers[pole];
    numbers[pole] = numbers[pivot];
    numbers[pivot] = temp2;

    return pole;
}

void quickSort(int numbers[], int start, int finish)
{
    int marker;
    if (start < finish)
    {
        marker = Partition(numbers, start, finish);
        quickSort(numbers, start, marker - 1);
        quickSort(numbers, marker + 1, finish);
    }
}
你应该写

finish = 10;
在你写的配分函数中

finish = size;
这超出了数组的末尾。你是说

int pivot = numbers[finish];
在分区函数中,运行如下循环:

int pivot = numbers[finish - 1];
使用透视值而不是透视索引的。它应该是:

for (int k = 0; k < finish - 1; k++)
int temp2 = numbers[pole];
numbers[pole] = numbers[pivot];
numbers[pivot] = temp2;
marker = Partition(numbers, start, finish);
quickSort(numbers, start, marker - 1);
quickSort(numbers, marker + 1, finish);
quickSort
的实现也是错误的:

int temp2 = numbers[pole];
numbers[pole] = numbers[finish - 1];
numbers[finish - 1] = temp2;
应该是:

for (int k = 0; k < finish - 1; k++)
int temp2 = numbers[pole];
numbers[pole] = numbers[pivot];
numbers[pivot] = temp2;
marker = Partition(numbers, start, finish);
quickSort(numbers, start, marker - 1);
quickSort(numbers, marker + 1, finish);

上面的更改修复了您的代码

更重要的是,我认为您需要更清楚地了解
start
finish
的含义。它们遵循的惯例是
start
是第一项的索引,而
finish
比最后一项的索引大一个。由于没有完全压缩,上面的许多错误都会减少一个错误废除本公约。

代替

int main()
    {
        int numbers[size] = {14, 7, 23, 31, 1, 20, 6, 3, 40, 5}, start, finish;

        cout << "Numbers are: " << endl;
        for (int i = 0; i < size; i++)
        {
            cout << numbers[i] << "\t";
        }

        finish = 10;
        start = 0;

        quickSort(numbers, start, finish);

        cout << "\n\nSorted: " << endl;
        for (int j = 0; j < size; j++)
        {
            cout << numbers[j] << "\t";
        }

        return 0;
    }

int Partition(int numbers[], int start, int finish)
{

    int pole = start;
    int pivot = numbers[finish];

    for (int k = 0; k < finish - 1; k++)
    {
        if (numbers[k] <= pivot)
        {
            int temp = numbers[k];
            numbers[k] = numbers[pole];
            numbers[pole] = temp;

            pole++;
        }
    }

    int temp2 = numbers[pole];
    numbers[pole] = numbers[pivot];
    numbers[pivot] = temp2;

    return pole;
}

void quickSort(int numbers[], int start, int finish)
{
    int marker;
    if (start < finish)
    {
        marker = Partition(numbers, start, finish);
        quickSort(numbers, start, marker - 1);
        quickSort(numbers, marker + 1, finish);
    }
}
marker = Partition(numbers, start, finish);
quickSort(numbers, start, marker);
quickSort(numbers, marker + 1, finish);
你应该写

finish = 10;
在你写的配分函数中

finish = size;
这超出了数组的末尾。你是说

int pivot = numbers[finish];
在分区函数中,运行如下循环:

int pivot = numbers[finish - 1];
使用透视值而不是透视索引的。它应该是:

for (int k = 0; k < finish - 1; k++)
int temp2 = numbers[pole];
numbers[pole] = numbers[pivot];
numbers[pivot] = temp2;
marker = Partition(numbers, start, finish);
quickSort(numbers, start, marker - 1);
quickSort(numbers, marker + 1, finish);
quickSort
的实现也是错误的:

int temp2 = numbers[pole];
numbers[pole] = numbers[finish - 1];
numbers[finish - 1] = temp2;
应该是:

for (int k = 0; k < finish - 1; k++)
int temp2 = numbers[pole];
numbers[pole] = numbers[pivot];
numbers[pivot] = temp2;
marker = Partition(numbers, start, finish);
quickSort(numbers, start, marker - 1);
quickSort(numbers, marker + 1, finish);

上面的更改修复了您的代码

更重要的是,我认为您需要更清楚地了解
start
finish
的含义。它们遵循的惯例是
start
是第一项的索引,而
finish
比最后一项的索引大一个。由于没有完全压缩,上面的许多错误都会减少一个错误废除本公约。

代替

int main()
    {
        int numbers[size] = {14, 7, 23, 31, 1, 20, 6, 3, 40, 5}, start, finish;

        cout << "Numbers are: " << endl;
        for (int i = 0; i < size; i++)
        {
            cout << numbers[i] << "\t";
        }

        finish = 10;
        start = 0;

        quickSort(numbers, start, finish);

        cout << "\n\nSorted: " << endl;
        for (int j = 0; j < size; j++)
        {
            cout << numbers[j] << "\t";
        }

        return 0;
    }

int Partition(int numbers[], int start, int finish)
{

    int pole = start;
    int pivot = numbers[finish];

    for (int k = 0; k < finish - 1; k++)
    {
        if (numbers[k] <= pivot)
        {
            int temp = numbers[k];
            numbers[k] = numbers[pole];
            numbers[pole] = temp;

            pole++;
        }
    }

    int temp2 = numbers[pole];
    numbers[pole] = numbers[pivot];
    numbers[pivot] = temp2;

    return pole;
}

void quickSort(int numbers[], int start, int finish)
{
    int marker;
    if (start < finish)
    {
        marker = Partition(numbers, start, finish);
        quickSort(numbers, start, marker - 1);
        quickSort(numbers, marker + 1, finish);
    }
}
marker = Partition(numbers, start, finish);
quickSort(numbers, start, marker);
quickSort(numbers, marker + 1, finish);
你应该写

finish = 10;
在你写的配分函数中

finish = size;
这超出了数组的末尾。你是说

int pivot = numbers[finish];
在分区函数中,运行如下循环:

int pivot = numbers[finish - 1];
使用透视值而不是透视索引的。它应该是:

for (int k = 0; k < finish - 1; k++)
int temp2 = numbers[pole];
numbers[pole] = numbers[pivot];
numbers[pivot] = temp2;
marker = Partition(numbers, start, finish);
quickSort(numbers, start, marker - 1);
quickSort(numbers, marker + 1, finish);
quickSort
的实现也是错误的:

int temp2 = numbers[pole];
numbers[pole] = numbers[finish - 1];
numbers[finish - 1] = temp2;
应该是:

for (int k = 0; k < finish - 1; k++)
int temp2 = numbers[pole];
numbers[pole] = numbers[pivot];
numbers[pivot] = temp2;
marker = Partition(numbers, start, finish);
quickSort(numbers, start, marker - 1);
quickSort(numbers, marker + 1, finish);

上面的更改修复了您的代码

更重要的是,我认为您需要更清楚地了解
start
finish
的含义。它们遵循的惯例是
start
是第一项的索引,而
finish
比最后一项的索引大一个。由于没有完全压缩,上面的许多错误都会减少一个错误废除本公约。

代替

int main()
    {
        int numbers[size] = {14, 7, 23, 31, 1, 20, 6, 3, 40, 5}, start, finish;

        cout << "Numbers are: " << endl;
        for (int i = 0; i < size; i++)
        {
            cout << numbers[i] << "\t";
        }

        finish = 10;
        start = 0;

        quickSort(numbers, start, finish);

        cout << "\n\nSorted: " << endl;
        for (int j = 0; j < size; j++)
        {
            cout << numbers[j] << "\t";
        }

        return 0;
    }

int Partition(int numbers[], int start, int finish)
{

    int pole = start;
    int pivot = numbers[finish];

    for (int k = 0; k < finish - 1; k++)
    {
        if (numbers[k] <= pivot)
        {
            int temp = numbers[k];
            numbers[k] = numbers[pole];
            numbers[pole] = temp;

            pole++;
        }
    }

    int temp2 = numbers[pole];
    numbers[pole] = numbers[pivot];
    numbers[pivot] = temp2;

    return pole;
}

void quickSort(int numbers[], int start, int finish)
{
    int marker;
    if (start < finish)
    {
        marker = Partition(numbers, start, finish);
        quickSort(numbers, start, marker - 1);
        quickSort(numbers, marker + 1, finish);
    }
}
marker = Partition(numbers, start, finish);
quickSort(numbers, start, marker);
quickSort(numbers, marker + 1, finish);
你应该写

finish = 10;
在你写的配分函数中

finish = size;
这超出了数组的末尾。你是说

int pivot = numbers[finish];
在分区函数中,运行如下循环:

int pivot = numbers[finish - 1];
使用透视值而不是透视索引的。它应该是:

for (int k = 0; k < finish - 1; k++)
int temp2 = numbers[pole];
numbers[pole] = numbers[pivot];
numbers[pivot] = temp2;
marker = Partition(numbers, start, finish);
quickSort(numbers, start, marker - 1);
quickSort(numbers, marker + 1, finish);
quickSort
的实现也是错误的:

int temp2 = numbers[pole];
numbers[pole] = numbers[finish - 1];
numbers[finish - 1] = temp2;
应该是:

for (int k = 0; k < finish - 1; k++)
int temp2 = numbers[pole];
numbers[pole] = numbers[pivot];
numbers[pivot] = temp2;
marker = Partition(numbers, start, finish);
quickSort(numbers, start, marker - 1);
quickSort(numbers, marker + 1, finish);

上面的更改修复了您的代码

更重要的是,我认为您需要更清楚地了解
start
finish
的含义。它们遵循的惯例是
start
是第一项的索引,而
finish
比最后一项的索引大一个。由于没有完全压缩,上面的许多错误都会减少一个错误取消此约定。

intmain(){
marker = Partition(numbers, start, finish);
quickSort(numbers, start, marker);
quickSort(numbers, marker + 1, finish);
整数[]={14,7,23,31,1,20,6,3,40,5}; 常量int size=sizeof(数字)/sizeof(整数); cout
intmain(){
整数[]={14,7,23,31,1,20,6,3,40,5};
常量int size=sizeof(数字)/sizeof(整数);
cout
intmain(){
整数[]={14,7,23,31,1,20,6,3,40,5};
常量int size=sizeof(数字)/sizeof(整数);
cout
intmain(){
整数[]={14,7,23,31,1,20,6,3,40,5};
常量int size=sizeof(数字)/sizeof(整数);

cout
int-pivot=numbers[finish];
读取超出数组末尾的内容。是时候进行一些调试了。啊,我将finish=10设置为9。但它仍然不能正确排序。不,那是错误的。我恢复了编辑。请不要将此设置为移动目标。我尝试了(int k=start;k int PIVoT =数字[完成]
读取的内容超出了数组的末尾。是时候进行一些调试了。啊,我将finish设置为10,固定为9。但它仍然不能正确排序。不,那是错误的。我还原了您的编辑。请不要将此设置为移动目标。我尝试了(int k=start;k int PIVoT =数字[完成]
读取的内容超出了数组的末尾。是时候进行一些调试了。啊,我将finish设置为10,固定为9。但它仍然不能正确排序。不,那是错误的。我还原了您的编辑。请不要将此设置为移动目标。我尝试了(int k=start;k int PIVoT =数字[完成]
读取的内容超出了数组的末尾。是时候进行一些调试了。啊,我将finish设置为10,固定为9。但它仍然不能正确排序。不,那是错误的。我还原了您的编辑。请不要将此设置为移动目标。我尝试了(int k=start;k