zoukankan      html  css  js  c++  java
  • 快速排序

    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); }   

  • 相关阅读:
    第十二节:类的定义
    第十二节:类的定义
    第十二节:类的定义
    Android核心技术Intent和数据存储篇
    Android核心技术Intent和数据存储篇
    Android核心技术Intent和数据存储篇
    ObjectDataSource配置数据源的时候,选择业务对象下拉菜单没有任何东西
    两个时间相差多少 .net中的timespan应用
    net3:DropDownList的动态绑定
    ADO:DataSet存入缓存Cache中并使用
  • 原文地址:https://www.cnblogs.com/jzhao/p/3046798.html
Copyright © 2011-2022 走看看