首页 > 代码库 > 编程练习:合并两个数组(包括三种快排程序)

编程练习:合并两个数组(包括三种快排程序)

  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 }

 

编程练习:合并两个数组(包括三种快排程序)