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 }