快速排序

int div(double *start,double *end)
 {
     double *privot,*p,*q,t;
	 p=start;
	 q=end-1;
	 privot=start;
	 if(start==end)
		 return 0;
	 while(p<q)
	 {
		 while(p<q)
		 {
			 if(*q<*privot)
			 {
				 t=*q;
				 *q=*privot;
				 *privot=t;
				 privot=q;
				 p++;
				 break;
			 }
			 q--;
		 }
		 while(p<q)
		 {
			 if(*p>*privot)
			 {
				 t=*p;
				 *p=*privot;
				 *privot=t;
				 privot=p;
				 q--;
				 break;
			 }
			 p++;
		 }		 
	 }
	  div(start,privot);
	  div(privot+1,end);
}

 

快速排序 题目:为数据序列22.5,23.9,12.3,23.4,34.8,34,45.2,46.8,22,12.9,34.88,76.34,54.88,76.55,43.22排序。 解题步骤: 第一步:将数据序列存入数组arr[LEN]中 第二步:将数组中的arr[0]中的值作为一个称为节点的值,令key=arr[0],即就是此时arr[0]的值和key相等; 设数组的下表为i=0;j=LEN-1;那么此刻arr[i]指的是数组第一个元素,arr[LEN-1]指的是数组最后一个元素 第三步:首先将arr[j]和key的值进行比较,如果arr[j]小于key那么将arr[j]和arr[0]进行交换,然后 那么,arr[j]==key即就是arr[j]的值等于key,否则将j的值减一然后重复进行将arr[j]和key的值进行比较,如果arr[j]小于key那么将arr[j]和arr[0]进行交换 那么,arr[j]==key即就是arr[j]的值等于key,直到找到满足arr[j]小于key的情况,最后将j的值减一。 第四步:首先将arr[i]可key的值进行比较,如果arr[i]>key那么将arr[i]和值为key的某个数组元素交换,交换后 arr[i]的值为key而只值为key的某个数组元素的值为arr[i]先前的值,如果arr[i]<key那么将i的值加一,后对 arr[i]可key的值进行比较,如果arr[i]>key那么将arr[i]和值为key的某个数组元素交换,交换后 arr[i]的值为key而只值为key的某个数组元素的值为arr[i]先前的值,直到找到满足arr[i]>key的元素为止,最后将i的值加一 注意: 每次j的值减一或i的值加一后都应该判断是否i>j如果大于结束对数组的一轮操作。 将下标小于m的元素进行上面的第三步和第四步的处理产生新的排序后的数组(等于m的元素即就是值为key的元素)将下标大于m 的元素进行上面的第三步和第四步的处理,产生新的排序后的数组, 对(以下标为m元素为分界点将数组分成了两个数组,两个数组都不包括下标为m元素)分出来的数组判断是否数组仅为一个元素,此时这个分出来的数组已经满足最终的排序要求。 */ #include <stdio.h> #define LEN 15 //div() 和div1()都可以实现快速排序,其实本质上都一样,div()递归调用参数较为难确定,建议用div()关键是排序的思想。 int div(double *arr,int len,int first); int div1(double *start,double *end); int main(void) { //第一步:将数据序列存入数组arr[LEN]中 double arr[LEN]={22.5,23.9,12.3,23.4,34.8,34.8,45.2,34.8,22,12.9,34.88,76.34,54.88,76.55,43.22};//{27,38,13}; //{27,38,13}; int first=0;//数组的第一个元素的下标 div(arr,LEN,first); //div(arr,arr+LEN); for(int i=0;i<LEN;i++) printf("%.2lf ,",arr[i]); return 0; } int div1(double *start,double *end) { double t; double *p=start; double *q=end-1; //第二步:将数组中的arr[0]中的值作为一个称为节点的值 double *k=start; //k标示值为key的数据(数组的第一个元素)的位置 double key=*start; //判断是否数组仅为一个元素,如果是结束递归调用 if(start==end) return 0; //第三步:首先将arr[j]和key的值进行比较,如果arr[j]小于key那么将arr[j]和arr[0]进行交换,然后 //那么,arr[j]==key即就是arr[j]的值等于key,否则将j的值减一然后重复进行将arr[j]和key的值进行比较,如果arr[j]小于key那么将arr[j]和arr[0]进行交换 //那么,arr[j]==key即就是arr[j]的值等于key,直到找到满足arr[j]小于key的情况,最后将j的值减一。 while(p<q||p==q)//每次j的值减一或i的值加一后都应该判断是否i>j如果大于结束对数组的一轮操作 { while(p<q||p==q) { if(*q<key) { t=*q; *q=*k; *k=t; k=q; q--; break; } else { q--; } } while(p<q||p==q) { if(*p>key) { t=*p; *p=*k; *k=t; k=p; p++; break; } else { p++; } } } //递归调用 div(start,k); div(k+1,end); } int div(double *arr,int len,int first) { if(len==0) return 0; double key=arr[first]; int k=first; int p=first,q=len+first-1; int i; double t; if(p==q) return 0; while(p<q||p==q) { while(p<q||p==q) { if(arr[q]<key) { t=arr[q]; arr[q]=arr[k]; arr[k]=t; k=q; q--; break; } else q--; } while(p<q||p==q) { if(arr[p]>key) { t=arr[p]; arr[p]=arr[k]; arr[k]=t; k=p; p++; break; } else p++; } } div(arr,k-first,first); div(arr,len+first-k-1,k+1); }   

 

posted @ 2013-04-27 12:36  创新突破游子恒心  阅读(147)  评论(0编辑  收藏  举报