#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[],int low,int high)
{ int mid;
int x;
mid=(low+high)/;
x=a[x]; while(low<high)
{
while(a[low]<x)
low++;
while(a[high]>x)
high--;
swap(a[low],a[high]);
}
quick_sort(a,,low);
quick_sort(a,low+,);
} int main(void)
{
int a[]={,,,,,,};
quick_sort(a,,); for(int i=;i<;i++)
cout<<a[i]<<" ";
}

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

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

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

下面的示例生成 C4717:

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

可以看出来是重复调用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) / ;
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 - );
quick_sort(a, first + , 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-);
Qsort(a, first+, high);
}
int main()
{
int a[] = {, , , , , , , , }; Qsort(a, , sizeof(a) / sizeof(a[]) - );/*ÕâÀïÔ­ÎĵÚÈý¸ö²ÎÊýÒª¼õ1·ñÔòÄÚ´æÔ½½ç*/ for(int i = ; i < sizeof(a) / sizeof(a[]); i++)
{
cout << a[i] << " ";
} return ;
}

c++实现快排出现错误的更多相关文章

  1. 数组第K小数问题 及其对于 快排和堆排 的相关优化比较

    题目描述 给定一个整数数组a[0,...,n-1],求数组中第k小数 输入描述 首先输入数组长度n和k,其中1<=n<=5000, 1<=k<=n 然后输出n个整形元素,每个数 ...

  2. hdu1157 快排

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1157 大意:排序,取中间数. PS:1.自己实现了下快排函数,也可以使用#include<algor ...

  3. JavaScript快排与原生sort的测试

    今天工作室断网!果断回宿舍,不然各种资料都没有.(他说将来会找到!)不好意思,又哼起来了.进入主题,大家都知道,快排是各种排序算法中,最高效的也是应用最广的,还有更重要的一点,面试特别爱考的! 其实大 ...

  4. poj 2804 字典 (特里 要么 快排+二分法)

    2804:词典 总时间限制:  3000ms  内存限制:  65536kB 描写叙述 你旅游到了一个国外的城市.那里的人们说的外国语言你不能理解.只是幸运的是,你有一本词典能够帮助你. 输入 首先输 ...

  5. hdu 1425:sort(排序,经典题。快排模板)

    sort Time Limit : 6000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submissi ...

  6. Java实现快排+小坑+partition的两种思路

    在做一道剑指Offer的题的时候,有道题涉及到快排的思路,一开始就很快根据以前的思路写出了代码,但似乎有些细节不太对劲,自己拿数据试了下果然.然后折腾了下并记录下一些小坑,还有总结下划分方法parti ...

  7. F#之旅4 - 小实践之快排

    参考文章:https://swlaschin.gitbooks.io/fsharpforfunandprofit/content/posts/fvsc-quicksort.html F#之旅4 - 小 ...

  8. 快排 快速排序 qsort quicksort C语言

    现在网上搜到的快排和我以前打的不太一样,感觉有点复杂,我用的快排是FreePascal里/demo/text/qsort.pp的风格,感觉特别简洁. #include<stdio.h> # ...

  9. iOS常见算法(二分法 冒泡 选择 快排)

    二分法: 平均时间复杂度:O(log2n) int halfFuntion(int a[], int length, int number)  { int start = 0; int end = l ...

随机推荐

  1. ClickJacking(点击劫持)

    问题: 点击劫持(ClickJacking)是一种视觉上的欺骗手段.大概有两种方式,一是攻击者使用一个透明的iframe,覆盖在一个网页上,然后诱使用户在该页面上进行操作,此时用户将在不知情的情况下点 ...

  2. velocity .vm

    关于.vm 后缀的文件,是velocity的文件.velocity是基于java的一种页面模板引擎,支持#if #else #foreach等写法的前台文件.$link.contextPath是该引擎 ...

  3. 如何设置word里的代码格式,使之有底纹的效果

    1.测试平台:word2013 2.步骤:设计->底纹->填充->应用于->确定 3.效果:

  4. MTK android 工程中如何修改照片详细信息中机型名

    每一个项目的机型名都不相同,因此拍出来的照片需要更改详细信息中的机型名. 那么,具体在哪里修改照片详细信息机型名呢 路径信息:/ALPS.JB3.TDD.MP.V2_TD_xxx/mediatek/c ...

  5. 解决memcached不能远程访问的问题

    之前安装好memcached之后,一直是在本机连接使用的,没有出现问题,今天我改用从另一台机器连接到memcached时,却怎么也连接不上.后来一直想大概是防火墙的问题,关闭了防火墙后问题依然存在. ...

  6. VSS迁移备忘

    今天早上服务器down掉了,没办法,只能把vss数据文件目录一并压缩,拷贝到本机.然后准备利用本机做服务端.下面是操作步骤: 1.将拷贝下来的文件夹设置为共享. 2.打开Microsoft Visua ...

  7. 用 CNTK 搞深度学习 (一) 入门

    Computational Network Toolkit (CNTK) 是微软出品的开源深度学习工具包.本文介绍CNTK的基本内容,如何写CNTK的网络定义语言,以及跑通一个简单的例子. 根据微软开 ...

  8. Opencv step by step - 图像变换

    这里举出三个案例: #include <cv.h> #include <highgui.h> void image_smooth(IplImage * image) { cvN ...

  9. 破解windows server 2008 的登录密码。有效的

    今天拿到一块以前服务器上替换下来的老盘,里面还有系统.挂载到另外一台闲置服务器,发现密码忘记了, 结果拿出pe和以前修改xp和2003的系统那样去修改发现不行,不知道为什么,修改SAM文件明明提示成功 ...

  10. 慢牛系列四:好玩的React Native

    在上次随笔(系列三)中,我试着用RN实现了一个Demo,感觉很不错,当时遇到的问题这篇文章里基本都解决了,比如导航动画问题,这篇文章里主要介绍RN的动画,学会动画以后,各种小创意都可以实现了^^ 下面 ...