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 }
  • 相关阅读:
    golang 数据结构 优先队列(堆)
    leetcode刷题笔记5210题 球会落何处
    leetcode刷题笔记5638题 吃苹果的最大数目
    leetcode刷题笔记5637题 判断字符串的两半是否相似
    剑指 Offer 28. 对称的二叉树
    剑指 Offer 27. 二叉树的镜像
    剑指 Offer 26. 树的子结构
    剑指 Offer 25. 合并两个排序的链表
    剑指 Offer 24. 反转链表
    剑指 Offer 22. 链表中倒数第k个节点
  • 原文地址:https://www.cnblogs.com/wswang/p/5112305.html
Copyright © 2011-2022 走看看