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; }
相关文章推荐
- 2叉树遍历的递归实现-使用c++模板
- C++处理一个动态规划的问题
- C++11 concurrent progamming (1) join/detach
- C++中覆盖、隐藏、重载
- c++,或者cococ2dx怎么利用jsonbox写入数据到json文件
- 学习日记之命令模式和Effective C++
- C++ string::size_type 类型
- C++构造函数初始化列表与赋值
- C++Primer第五版课后答案地址
- C++自定义类中使用string变量问题
- C++之函数复习
- C++ Primer Plus 第六版(中文版)课后编程题----第七章
- C++ stringstream介绍,使用方法与例子
- SIFT+RANSAC做图像矫正
- C++开发人脸性别识别教程(6)——通过SVM实现性别识别
- 对C++ XML解析器TinyXML中关于‘&’字符操作的修改
- libctemplate——C语言模块引擎简介及使用
- c语言
- C语言学习之关键字第七讲
- C/C++ 的关系运算符采用短路运算