2013-04-13 94 views
0

所以我正在实施快速排序,并且一旦我启动程序就会出现错误。我认为逻辑明智的一切应该没问题。我认为这个问题在swap函数中,因为如果我把它注释掉了,它不会崩溃。快速排序实施崩溃

#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; 
} 

回答

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]多次,这是超出界限。

此外,阵列从01启动(参见:quick_sort(arr, 1, 5);

+1

他有很多错误,这是肯定的。只是这些改变也不能解决它。 +1。 –

+1

+1 - 问题的最完整列表。 – pstrjds

3

那么,您的交换功能,但它在它没有什么会本身导致崩溃。当你注释掉时没有看到任何崩溃的原因是当swap1不是程序的一部分时,你的程序不会写入内存。

这里是您的交换功能,以供参考:

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

注意,你给它分配后不使用tmp。我想你想要的最后一行是:

y = tmp; 

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

+0

我删除了这个错误,但必须有更多的东西;它仍然崩溃。 – Bloodcount

1

你正在做交换错误。将其更改为:

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

您也有错误arr[length],索引不好。你的交换功能是非常特殊的交换,而不是交换元素在这一刻导致xy都具有相同的值y

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函数nction,它调用长度为5的分区。然后在分区代码中执行arr[5],但数组的最后一个元素是4,因为数组是基于零的索引。

0

更换交换乐趣。到:

void swap1(int& x, int& y) 

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

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

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

貌似无休止的故事..更新到任何你想要的状态。