您的位置:首页 > 编程语言 > C语言/C++

c++实现快排出现错误

2016-01-08 10:33 232 查看
#include"header_file.h"
using namespace std;

void swap(int a,int b)
{
int t;
t=a;
a=b;
b=t;
}

void quick_sort(int a[7],int low,int high)
{

int mid;
int x;
mid=(low+high)/2;
x=a[x];

while(low<high)
{
while(a[low]<x)
low++;
while(a[high]>x)
high--;
swap(a[low],a[high]);
}
quick_sort(a,0,low);
quick_sort(a,low+1,6);
}

int main(void)
{
int a[7]={4,3,6,7,2,1,5};
quick_sort(a,0,6);

for(int i=0;i<7;i++)
cout<<a[i]<<" ";
}


运行出现c4717错误,看msdn解释如下:

“function”: 递归所有控件路径,函数将导致运行时堆栈溢出

每个涉及函数的路径都包含对该函数的调用。因为无法在没有首次递归调用函数本身的情况下退出该函数,所以函数将永远不退出。

下面的示例生成 C4717:

// C4717.cpp
// compile with: /W1 /c
// C4717 expected
int func(int x) {
if (x > 1)
return func(x - 1); // recursive call
else {
int y = func(0) + 1; // recursive call
return y;
}
}

int main(){
func(1);
}


可以看出来是重复调用func(0),而这个func(0)并没有一个返回值,所以会导致永远卡在这里,永不退出。

回过头看我们的函数: 当low=high的时候根本没有返回,就会一直调用,产生同样的错误,在前边排序函数中加入

if(low>=high)
return;


就不会报错了,不过还是会产生栈溢出的问题。

stackoverflow上的一个一样的问题:http://stackoverflow.com/questions/8770081/segfault-with-a-quicksort-implementation-in-c/8770117#8770117

看了之后改成了:

void quick_sort(int a[], int low, int high)
{

if (low >= high)
return ;

int first;
int last;
first = low;
last = high;

int mid;
int x;
mid = (first + last) / 2;
x = a[mid];

first++;
while (first<last)
{
while ((first <= last) && (a[first] <= x)  )
first++;
//    a[first] = a[last];
while ((first <= last) && (a[last] >= x)  )
last--;
swap(a[last], a[first]);
}

quick_sort(a, low, first - 1);
quick_sort(a, first + 1, high);
}


然后程序运行之后没有任何反应。原因不清楚,求人解答

解答:见另外一篇快排的博文,是由于不管while是否执行都会执行swap导致的

看看正确的应该怎么写:

#include <iostream>

using namespace std;

void Qsort(int a[], int low, int high)
{
if(low >= high)
{
return;
}
int first = low;
int last = high;
int key = a[first];/*ÓÃ×Ö±íµÄµÚÒ»¸ö¼Ç¼×÷ΪÊàÖá*/

while(first < last)
{
while(first < last && a[last] >= key)
{
--last;
}

a[first] = a[last];/*½«±ÈµÚÒ»¸öСµÄÒƵ½µÍ¶Ë*/

while(first < last && a[first] <= key)
{
++first;
}

a[last] = a[first];
/*½«±ÈµÚÒ»¸ö´óµÄÒƵ½¸ß¶Ë*/
}
a[first] = key;/*ÊàÖá¼Ç¼µ½Î»*/
Qsort(a, low, first-1);
Qsort(a, first+1, high);
}
int main()
{
int a[] = {57, 68, 59, 52, 72, 28, 96, 33, 24};

Qsort(a, 0, sizeof(a) / sizeof(a[0]) - 1);/*ÕâÀïÔ­ÎĵÚÈý¸ö²ÎÊýÒª¼õ1·ñÔòÄÚ´æÔ½½ç*/

for(int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
{
cout << a[i] << " ";
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: