1 /*
2 问题描述:
3 给定一个递增的正整数序列和一个正整数M,求序列中的两个不同位置的数a和b,使得它们的和恰好为M,输出所有满足条件的方案。
4 */
5 int i=0, j=n-1;
6 while(i < j)
7 {
8 if(a[i] + a[j] == m)
9 {
10 printf("%d %d\n", i, j);
11 i++;
12 j--;
13 }x
14 else if(a[i] + a[j] < m)
15 {
16 i++;
17 }
18 else
19 {
20 j--;
21 }
22 }
23
24 /*
25 问题描述:
26 假设有两个递增序列A和B,要求将它们合并为一个递增序列C。
27 */
28 int Merge(int A[], int B[], int C[], int n, int m)
29 {
30 int i=0, j=0, index=0;
31 while(i < n && j < m)
32 {
33 if(A[i] <= B[j])
34 {
35 C[index++] = A[i++];
36 }
37 else
38 {
39 C[index++] = B[j++];
40 }
41 }
42
43 while(i < n)
44 {
45 C[index++] = A[i++];
46 }
47 while(j < m)
48 {
49 C[index++] = B[j++];
50 }
51
52 return index;
53 }
54
55 /*-------------------------------------2-路归并排序-----------------------------------*/
56
57 /*
58 递归实现
59 */
60 const int maxn = 100;
61
62 //将数组A的[L1,R1]与[L2,R2]区间合并为有序区间(此处L2即为R1+1)
63 void merge(int A[], int L1, int R1, int L2, int R2)
64 {
65 int i=L1, j=L2;
66 int temp[maxn], index=0; //temp临时存放合并后的数组,index为其下标
67 while(i <= R1 && j <= R2)
68 {
69 if(A[i] <= A[j])
70 {
71 temp[index++] = A[i++];
72 }
73 else
74 {
75 temp[index++] = A[j++];
76 }
77 }
78
79 while(i <= R1)
80 {
81 temp[index++] = A[i++];
82 }
83 while(j <= R2)
84 {
85 temp[index++] = A[j++];
86 }
87
88 for(i=0; i<index; i++)
89 {
90 A[L1+i] = temp[i];
91 }
92 }
93
94 //将array数组当前区间[left, right]进行归并排序
95 void mergeSort(int A[], int left, int right)
96 {
97 if(left < right)
98 {
99 int mid = (left + right) / 2;
100 {
101 int mid = (left+right) / 2;
102 mergeSort(A, left, mid);
103 mergeSort(A, mid+1, right);
104
105 //将左子区间和右子区间合并
106 merge(A, left, mid, mid+1, right);
107 }
108 }
109 }
110
111 /*
112 非递归实现
113 */
114 void mergeSort(int A[])
115 {
116 //step为组内元素个数,step/2为左子区间元素个数,注意等号可以不取
117 for(int step=2; step/2<=n; step*=2)
118 {
119 //每step个元素一组,组内前step/2和后step/2个元素进行合并
120 for(int i=1; i<=n; i+=step)
121 {
122 int mid = i + step/2 - 1; //左子区间元素个数为step/2
123 if(mid + 1 <= n) //右子区间存在元素,则合并
124 {
125 merge(A, i, mid, mid+1, min(i+step-1, n));
126 }
127
128 //
129 // 循环内可以用sort函数替代,会增大时间复杂度
130 //
131 /*
132 sort(A+i, A+min(i+step, n+1));
133 */
134 }
135 }
136 }
137
138 /*------------------------------------快速排序----------------------------------*/
139 int Partition(int A[], int left, int right)
140 {
141 int temp = A[left];
142 while(left < right)
143 {
144 while(left<right && A[right]>temp)
145 {
146 right--;
147 }
148 A[left] = A[right];
149 while(left<right && A[left]<=temp)
150 {
151 left++;
152 }
153 A[right] = A[left];
154 }
155 A[left] = temp;
156
157 return left;
158 }
159
160 void quickSort(int A[], int left, int right)
161 {
162 if(left < right)
163 {
164 int pos = Partition(A, left, right);
165 quickSort(A, left, pos-1);
166 quickSort(A, pos+1, right);
167 }
168 }
169
170 /*
171 生成随机数
172 */
173 #include <stdio.h>
174 #include <stdlib.h>
175 #include <time.h>
176 #include <math.h>
177
178 int main(void)
179 {
180 //初始化随机数种子
181 srand((unsigned)time(NULL));
182
183 printf("%d\n", RAND_MAX);
184 /*
185 output:
186 32767
187 */
188
189 for(int i=0; i<10; i++)
190 {
191 //
192 // rand() = [0, RAND_MAX]
193 //
194 // rand()%(b-a+1)+a = [a, b]
195 //
196 // 此时的b最大可以取RAND_MAX
197 //
198 printf("%d ", rand()%5+3); //[3,7]
199 }
200
201 printf("\n");
202
203 for(int i=0; i<10; i++)
204 {
205 //
206 // rand()/RAND_MAX*1.0 = [0,1]
207 //
208 // round()四舍五入
209 //
210 // [0,1]*(b-a)+a = [a,b]
211 //
212 printf("%d ", (int)(round(1.0*rand()/RAND_MAX*50000+10000))); //[10000,60000]
213 }
214
215 return 0;
216 }
217
218 /*
219 随机Partition
220 */
221 int randPartition(int A[], int left, int right)
222 {
223 //生成[left, right]内的随机数P
224 int p = (round(1.0*rand()/RAND_MAX*(right-left)+left));
225 swap(A[p], A[left]);
226
227 int temp = A[left];
228 while(left < right)
229 {
230 while(lefr<right && A[right]>temp)
231 {
232 right--;
233 }
234 A[left] = A[right];
235 while(left<right && A[left]<=temp)
236 {
237 left++;
238 }
239 A[right] = A[left];
240 }
241 A[left] = temp;
242
243 return left;
244 }