zoukankan      html  css  js  c++  java
  • c++实现快排出现错误

     1 #include"header_file.h"
     2 using namespace std;
     3 
     4 void swap(int a,int b)
     5 {
     6     int t;
     7     t=a;
     8     a=b;
     9     b=t;
    10 }
    11 
    12 void quick_sort(int a[7],int low,int high)
    13 {
    14     
    15     int mid;
    16     int x;
    17     mid=(low+high)/2;
    18     x=a[x];
    19     
    20     while(low<high)
    21     {
    22         while(a[low]<x)
    23             low++;
    24         while(a[high]>x)
    25             high--;
    26         swap(a[low],a[high]);
    27     }
    28     quick_sort(a,0,low);
    29     quick_sort(a,low+1,6);
    30 }
    31 
    32 int main(void)
    33 {
    34     int a[7]={4,3,6,7,2,1,5};
    35     quick_sort(a,0,6);
    36     
    37     for(int i=0;i<7;i++)
    38         cout<<a[i]<<" ";
    39 }

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

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

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

    下面的示例生成 C4717:

     1 // C4717.cpp
     2 // compile with: /W1 /c
     3 // C4717 expected
     4 int func(int x) {
     5    if (x > 1)
     6       return func(x - 1); // recursive call
     7    else {
     8       int y = func(0) + 1; // recursive call
     9       return y;
    10    }
    11 }
    12 
    13 int main(){
    14    func(1);
    15 }

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

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

    1 if(low>=high)
    2     return;

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

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

    看了之后改成了:

     1 void quick_sort(int a[], int low, int high)
     2 {
     3 
     4     if (low >= high)
     5         return ;
     6     
     7     int first;
     8     int last;
     9     first = low;
    10     last = high;
    11 
    12     int mid;
    13     int x;
    14     mid = (first + last) / 2;
    15     x = a[mid];
    16 
    17     first++;
    18     while (first<last)
    19     {
    20         while ((first <= last) && (a[first] <= x)  )
    21             first++;
    22     //    a[first] = a[last];
    23         while ((first <= last) && (a[last] >= x)  )
    24             last--;
    25         swap(a[last], a[first]);
    26     }
    27 
    28     quick_sort(a, low, first - 1);
    29     quick_sort(a, first + 1, high);
    30 }

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

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

    看看正确的应该怎么写:

     1 #include <iostream>
     2  
     3 using namespace std;
     4  
     5 void Qsort(int a[], int low, int high)
     6 {
     7     if(low >= high)
     8     {
     9         return;
    10     }
    11     int first = low;
    12     int last = high;
    13     int key = a[first];/*ÓÃ×Ö±íµÄµÚÒ»¸ö¼Ç¼×÷ΪÊàÖá*/
    14  
    15     while(first < last)
    16     {
    17         while(first < last && a[last] >= key)
    18         {
    19             --last;
    20         }
    21  
    22         a[first] = a[last];/*½«±ÈµÚÒ»¸öСµÄÒƵ½µÍ¶Ë*/
    23  
    24         while(first < last && a[first] <= key)
    25         {
    26             ++first;
    27         }
    28          
    29         a[last] = a[first];    
    30 /*½«±ÈµÚÒ»¸ö´óµÄÒƵ½¸ß¶Ë*/
    31     }
    32     a[first] = key;/*ÊàÖá¼Ç¼µ½Î»*/
    33     Qsort(a, low, first-1);
    34     Qsort(a, first+1, high);
    35 }
    36 int main()
    37 {
    38     int a[] = {57, 68, 59, 52, 72, 28, 96, 33, 24};
    39  
    40     Qsort(a, 0, sizeof(a) / sizeof(a[0]) - 1);/*ÕâÀïÔ­ÎĵÚÈý¸ö²ÎÊýÒª¼õ1·ñÔòÄÚ´æÔ½½ç*/
    41  
    42     for(int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
    43     {
    44         cout << a[i] << " ";
    45     }
    46      
    47     return 0;
    48 }
  • 相关阅读:
    MySQL学习笔记(一)
    MySQL学习笔记(六)
    MySQL学习笔记(三)
    MySQL学习笔记(二)
    eclipse使用SSH框架出现There is no Action mapped for namespace [/] and action name [] associated with context path错误
    网页分页功能的实现
    Linux配置LNMP环境(一)配置Nginx
    Linux配置LNMP环境(二)配置PHP
    [转]在WPF的TreeView中实现右键选定
    .NET 导出到Excel功能
  • 原文地址:https://www.cnblogs.com/wswang/p/5112305.html
Copyright © 2011-2022 走看看