user-0 提问: 关于快速排序算法

回复:
user: user-0
content: 引用 6 楼 u012514171 的回复:楼主我粗略的看了一下楼主的传参，楼主传进去的参数貌似没有被改变，改变的只是形参的变量值（这个值是拷贝的实参的值），所以打印出来的应该是没有改变的x[]，但是却偏偏又什么都没有打印出来，应该是留在了QuickSort函数里面，设断点单步调试吧调试了一下，终于发现果然是卡在QuickSort里面（不愧是高手！），经过修改，现在已经可以了~

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:为什么不参考下面随便哪个 C:\Microsoft SDK\src\crt\qsort.c C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\src\crt\qsort.c C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\QSORT.C C:\Program Files\Microsoft Visual Studio 8\VC\crt\src\qsort.c C:\Program Files\Microsoft Visual Studio 9.0\VC\crt\src\qsort.c C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\qsort.c 呢？想根据自己的思路编一个

user: user-1
content: 使用了测试代码并在linux mint上编译通过，经供参考 /*  * 快速排序  */  #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> #include <unistd.h> #include <math.h>  int* a; int n	=10; int len	=10; int num;  void putf();  void make_num() { 	int i; 	int j; 	srand((int)time(0)); 	for(i=0;i<n;i++) 	{ 		a[i]=abs(rand())%len+1; 		for(j=0;j<i;j++) 		{ 			if(a[i]==a[j]) 			{ 				i--; 				break; 			} 		} 	} }  void sort(int head,int end) { 	int i=head+1; 	int j=end-1; 	int t=a[head]; 	int temp; 	if(head>=end) 	{ 		return ; 	} 	for(;i<=j;) 	{ 		for(;a[i]<=t&&i<=end;num++,i++); 		for(;a[j]>t;num++,j--); 		if(a[i]>t&&a[j]<=t&&i<=j) 		{ 			temp=a[i];a[i]=a[j];a[j]=temp; 		} 		num++; 	} 	temp=a[head];a[head]=a[j];a[j]=temp; 	sort(head,j); 	sort(j+1,end); }  void putf() { 	int i; 	printf("%d:",num); 	for(i=0;i<n;i++) 	{ 		printf("%3d ",a[i]); 	} 	printf("\n"); }  int main() { 	int sum=0; 	int i=1; 	srand((int)time(0)); 	a=(int*)malloc(sizeof(int)*n); 	for(;;) 	{ 		num=0; 		make_num(); 		putf(); 		sort(0,n); 		sum=sum+num; 		printf("\r%d:%f",num,sum*1.0/i++); 		putf(); 		printf("\n"); 		sleep(1); 	} 	return 0; }

user: user-1
content: 为什么上代码呢？图片那么好吗？

user: user-2
content: LZ，你自己有没有单步调用一下？

user: user-3
content: /*  ============================================================================  Name        : quick_sort.c  Author      : braveboyny  Version     :  Copyright   : Your copyright notice  Description : quick_sort in C, Ansi-style  ============================================================================  */  #include<stdio.h> int partition(int array[],int low,int high) { 	int i,j,key,temp; 	key=array[high];/*以key值作为参考将数组划分成大于key和小于key的2部分*/ 	i=low-1;  /*以i作为边界，小于key的放在i（包括i）左边，大于key的放在在i右边 			   *初始默认都大于key*/ 	for(j=low;j<high;j++){ 		if(array[j]<=key){ 			i=i+1;  /*若array[j]<=key,则将array[i+1]与array[i]交换， 			 	 	 *因为i是边界所以i+1代表的数绝B大于key,这样就将小于key的值放在了i左边*/ 			temp=array[i]; 			array[i]=array[j]; 			array[j]=temp; 			} 	} 	temp=array[i+1]; 	array[i+1]=array[high]; 	array[high]=temp;/*最后将大于key的array[i+1]于key也就是array[high]交换 	 	 	 	 	 	 	 	  * 这样分组就圆满完成了*/ 	return i+1; } void quick_sort(int array[],int low,int high) { 	int k; 	if(low<high){ 		k=partition(array,low,high); 		quick_sort(array,low,k-1); 		quick_sort(array,k+1,high); 	} } int main(int argc,char *argv[]) { 	int array[10]={8,2,3,6,5,9,4,1,0,7},i; 	quick_sort(array,0,9); 	for(i=0;i<10;i++) 		printf("%d ",array[i]); 	putchar('\n'); 	return 0; } //out:0 1 2 3 4 5 6 7 8 9

user: user-4
content: 楼主我粗略的看了一下楼主的传参，楼主传进去的参数貌似没有被改变，改变的只是形参的变量值（这个值是拷贝的实参的值），所以打印出来的应该是没有改变的x[]，但是却偏偏又什么都没有打印出来，应该是留在了QuickSort函数里面，设断点单步调试吧

user: user-4
content: 引用 3 楼 Koptop 的回复:http://blog.csdn.net/morewindows/article/details/6684558  这里面讲快排讲的简单易懂，楼主可以看一下，然后对比你自己写的看有什么差别。最好自己单步调试一下参考这个！

user: user-5
content: 这里也有一篇快速排序的文章，供楼主参考。

user: user-6
content: http://blog.csdn.net/morewindows/article/details/6684558  这里面讲快排讲的简单易懂，楼主可以看一下，然后对比你自己写的看有什么差别。最好自己单步调试一下

user: user-7
content: 为什么不参考下面随便哪个 C:\Microsoft SDK\src\crt\qsort.c C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\src\crt\qsort.c C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\QSORT.C C:\Program Files\Microsoft Visual Studio 8\VC\crt\src\qsort.c C:\Program Files\Microsoft Visual Studio 9.0\VC\crt\src\qsort.c C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\qsort.c 呢？