双指针
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 }