快速排序实现崩溃

时间:2013-04-13 16:34:19

标签: c++ algorithm quicksort

所以我正在实施快速排序,一旦启动程序我就会收到错误。我认为逻辑方面的一切都应该没问题。我认为问题出在交换函数中,因为如果我将它注释掉它就不会崩溃。

#include <iostream>

using namespace std;

void swap1(int& x, int& y)
{
    int tmp = x;
    x = y;
    y = x;
}

int partition(int arr[], int cof, int length)
{
    int x = arr[length];
    int j = cof -1;
    for(int i = cof; length-1; i++ )
    {
        if(arr[i] <= x)
        {
            i++;
            swap1(arr[i], arr[j]);

        }
        swap1(arr[i+1], arr[length]);
    }
    return j++;
}


void quick_sort(int arr[], int cof, int length)
{
    if(cof < length)
    {
        int q = partition(arr, cof, length);
        quick_sort(arr,cof, q-1);
        quick_sort(arr,q+1, length);
    }
}

int main()
{
    int arr[]={1, 3, 2, 5, 4};
    quick_sort(arr, 1, 5);
    for(int i = 0; i < 5; i++)
    {
        cout << arr[i] << endl;
    }
    return 0;
}

5 个答案:

答案 0 :(得分:8)

坠机的主要原因!

for中的情况很奇怪:

for(int i = cof; length-1; i++ )

应该是

for(int i = cof; i<length-1; i++ )
                 ^^

并更正您的交换功能:

void swap1(int& x, int& y)
{
    int tmp = x;
    x = y;
    y = tmp; // <-- use tmp
}

还有很多其他错误......

例如,您多次触摸arr[length]超出范围。

此外,数组从0开始而不是1(请参阅:quick_sort(arr, 1, 5);

答案 1 :(得分:3)

好吧,你的交换功能错误,但它没有任何内容会导致崩溃。当你发表评论时你没有看到任何崩溃的原因是当swap1不是程序的一部分时你的程序永远不会写入内存。

这是你的交换函数供参考:

void swap1(int& x, int& y)
{
    int tmp = x;
    x = y;
    y = x;
}

请注意,在分配之后,您不会使用 tmp。我想你想要最后一行:

y = tmp;

编辑:您的程序也有其他错误。例如,arr[length]不是您创建的数组的元素。

答案 2 :(得分:2)

我相信这条线导致你的崩溃 -

int partition(int arr[], int cof, int length)
{
    int x = arr[length];

您可能需要将其更改为

int partition(int arr[], int cof, int length)
{
    int x = arr[length-1];

在你的示例main函数中,你创建了一个长度为5的数组,你将5传递给quick_sort函数,该函数调用长度为5的分区。然后你在arr[5]中执行分区代码,但是数组的最后一个元素是4,因为数组是基于零的索引。

答案 3 :(得分:1)

你交换错了。将其改为:

void swap1(int& x, int& y)
{
    int tmp = x;
    x = y;
    y = tmp;
}

您的arr[length]错误,索引错误。您的交换函数是非常特殊的交换,而不是在此时交换元素,导致xy都具有相同的y值。

答案 4 :(得分:0)

更改交换乐趣。到:

void swap1(int& x, int& y)

{
    int tmp = x;
    x = y;
    y = tmp;        <========= here
}

当然,这不是你问题的根源。 这个循环:

for (int i = cof; length-1; i++ ) 

看起来像无尽的故事..将条件更新为你想要的任何东西。