所以我正在实施快速排序,一旦启动程序我就会收到错误。我认为逻辑方面的一切都应该没问题。我认为问题出在交换函数中,因为如果我将它注释掉它就不会崩溃。
#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;
}
答案 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]
错误,索引错误。您的交换函数是非常特殊的交换,而不是在此时交换元素,导致x
和y
都具有相同的y
值。
答案 4 :(得分:0)
更改交换乐趣。到:
void swap1(int& x, int& y)
{
int tmp = x;
x = y;
y = tmp; <========= here
}
当然,这不是你问题的根源。 这个循环:
for (int i = cof; length-1; i++ )
看起来像无尽的故事..将条件更新为你想要的任何东西。