C++ 快速排序算法

Posted

技术标签:

【中文标题】C++ 快速排序算法【英文标题】:C++ Quicksort Algorithm 【发布时间】:2016-03-09 22:46:50 【问题描述】:

我正在使用 c++ 实现快速排序算法,但我无法让它正常工作。我研究了几个来源,我的代码看起来完美无瑕,但数组没有按应有的排序。

这是我的代码:

#include <iostream>
using namespace std;

void quicksort(int[],int, int);
int partition(int[], int, int);

int main()

    int a[] = 5, 1, 9, 3, 8, 4, 1, 2, 6, 7;
    for (int i = 0; i < 10; i++)
     
        cout << a[i] << " ";
    
    cout << endl;
    quicksort(a, 0, 9);
    for (int i = 0; i < 10; i++)
    
            cout << a[i] << " ";
    
    return 0;


void quicksort(int a[], int p, int r)

    if (p < r)
    
            int q = partition(a, p, r);
            quicksort(a, p, q - 1);
            quicksort(a, q + 1, r);
   


int partition(int a[], int p, int r)

    int x = a[r];
    int i = (p - 1);
    for (int j = p; j <= r-1; j++)
    
        if (a[j] <= x)
        
                i++;
                int tmp = a[i];
                a[i] = a[j];
                a[j] = tmp;
        
     
     int tmp = a[i+1];
     a[i+1] = a[r];
     a[r] = a[tmp];
     return (i + 1);

当我运行这段代码时,会显示以下内容:

5 1 9 3 8 4 1 2 6 7
1 1 2 4 4 4 6 7 7 7

我不确定我在这里做错了什么。感谢您的帮助。

【问题讨论】:

您是否尝试过使用调试器单步执行?应该可以帮助您了解发生了什么。 另外,显然:std::sort. 还有一个很好的规则是,当您使用数组索引时,请尝试在 for 循环中始终使用“for (i = 0; i 的 for 循环。 a[tmp];是你的主要错误。 @Tuffwer 是的,你是对的。 【参考方案1】:

在分区函数的倒数第二行中,您应该有:

  a[r] = tmp;

代替:

  a[r] = a[tmp];

您正在用其他成员覆盖数组的一部分,而不是完成交换的第三步。

【讨论】:

好收获!但是更改后,我的程序显示: 8 2 8 8 32767 9 32767 100001 7 用于排序数组的输出。 @tfreiner 我不确定。当我在ideone(在线编译器)上运行您的代码时,它似乎可以正常工作。 @tfreiner 如果你继续遇到问题,你得到的值向我暗示某些地方没有正确初始化,或者你正在读取数组的边界但仍在程序拥有的内存中(因此没有段错误)我建议按照 tofro 所说的做,并使用调试器逐步查看值在程序执行时如何变化。如果您不知道如何使用调试器,您也可以编写描述性打印语句,但最好学习如何使用调试器 我发现我犯了一个愚蠢的错误。我将您的编辑应用于错误的文件。我现在运行得很好,谢谢!

以上是关于C++ 快速排序算法的主要内容,如果未能解决你的问题,请参考以下文章

排序算法的c++实现——快速排序

500,000 个已排序整数数组上的 C++ 快速排序算法中的 Seg 错误

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

在最佳情况下,由于堆栈溢出错误,快速排序算法失败 - C++

C++入门:排序之快速排序

排序算法——快速排序的图解代码实现以及时间复杂度分析