首页 > 代码库 > 编程练习:合并两个数组(包括三种快排程序)
编程练习:合并两个数组(包括三种快排程序)
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 /*确定快排1的分界值*/ 5 int partition1(int array[],int r,int m){ 6 int i,j=m,temp,flag1=0,flag2=0;//比较的数是大数时将flag1置1,也就是当遇到大数之后,再次遇到小数才进行前后交换; 7 //flag2为0时,j=i,第一次遇到大数时,把flag2置1;也就是说,j的初始值为参考值的坐标, 8 //当遇到大数时,j的值改变为第一个大数的坐标(j=i),后续j的值的变化仅跟是否发生交换有关 9 if(r<m){ 10 for(i=r;i<m;i++){ 11 if(array[i]>array[m]){ 12 flag1=1; 13 if(!flag2) { 14 j=i; 15 flag2=1; 16 } 17 } 18 else{ 19 if(flag1){ 20 temp=array[i]; 21 array[i]=array[j]; 22 array[j]=temp; 23 j++; 24 } 25 } 26 } 27 temp=array[j]; 28 array[j]=array[m]; 29 array[m]=temp; 30 return j; 31 } 32 } 33 /*快排1,以最后一个数作为参考值*/ 34 void sort1(int array[],int r,int m){ 35 int p; 36 if(r<m){ 37 p=partition1(array,r,m); 38 sort1(array,r,p-1); 39 sort1(array,p+1,m); 40 } 41 } 42 /*确定快排2的分界值*/ 43 int partition2(int array[],int r,int m){ 44 int i,j=m+1,temp,flag1=0,flag2=0;//比较的数是大数时将flag1置1,也就是当遇到大数之后,再次遇到小数才进行前后交换; 45 //flag2为0时,j=i,第一次遇到大数时,把flag2置1;也就是说,j的初始值为参考值的坐标, 46 //当遇到大数时,j的值改变为第一个大数的坐标(j=i),后续j的值的变化仅跟是否发生交换有关 47 if(r<m){ 48 for(i=r+1;i<=m;i++){ 49 if(array[i]>array[r]){ 50 flag1=1; 51 if(!flag2) { 52 j=i; 53 flag2=1; 54 } 55 } 56 else{ 57 if(flag1){ 58 temp=array[i]; 59 array[i]=array[j]; 60 array[j]=temp; 61 j++; 62 } 63 } 64 } 65 temp=array[j-1]; 66 array[j-1]=array[r]; 67 array[r]=temp; 68 return j-1; 69 } 70 } 71 /*快排2*/ 72 void sort2(int array[],int r,int m){ 73 int p; 74 if(r<m){ 75 p=partition2(array,r,m); 76 sort2(array,r,p-1); 77 sort2(array,p+1,m); 78 } 79 } 80 81 /*快排3*/ 82 void sort3(int array[],int r,int m){ 83 int low=r,high=m,key=array[r]; 84 if(low<high){ 85 while(low<high){ 86 while(low<high&&array[high]>key) 87 high--; 88 array[low]=array[high]; 89 while(low<high&&array[low]<key) 90 low++; 91 array[high]=array[low]; 92 } 93 array[low]=key; 94 sort3(array,r,low-1); 95 sort3(array,low+1,m); 96 } 97 } 98 99 int main(int argc, char *argv[]) {100 int i,j,k,m,n,A[500],B[500],C[1000];101 scanf("%d",&m);102 for(i=0;i<m;i++)103 scanf("%d",&A[i]);104 scanf("%d",&n);105 for(j=0;j<n;j++)106 scanf("%d",&B[j]);107 i=j=0;108 109 /*合并两个有序的数组*/110 // for(k=0;k<m+n;k++){111 // if(i>=m&&j<n){112 // C[k]=B[j];113 // j++; 114 // }115 // if(j>=n&&i<m){116 // C[k]=A[i]; 117 // i++; 118 // }119 // if(i<m&&j<n){120 // if(A[i]<B[j]){121 // C[k]=A[i];122 // i++; 123 // }124 // else{125 // C[k]=B[j];126 // j++; 127 // }128 // }129 // }130 131 /*合并两个无序的数组*/132 for(k=0;k<m+n;k++){133 if(i<m){134 C[k]=A[i];135 i++;136 }137 else{138 C[k]=B[j];139 j++;140 } 141 }142 //sort1(C,0,m+n-1); 143 //sort2(C,0,m+n-1); 144 sort3(C,0,m+n-1); 145 146 //打印合并后的有序数组 147 for(k=0;k<m+n;k++)148 printf("%d ",C[k]);149 printf("\n");150 return 0;151 }
编程练习:合并两个数组(包括三种快排程序)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。