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 }