双指针

Date:2019-07-31 19:03:46

算法实现

  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 }

 

posted @ 2019-07-31 19:04  林東雨  阅读(212)  评论(0编辑  收藏  举报