期望为线性时间的选择算法RANDOM_SELECT
1 #include<iostream> 2 #include<ctime> 3 using namespace std; 4 void swap(int *a, int *b) 5 { 6 int *c = a; 7 a = b; 8 b = c; 9 } 10 int Partition(int *A, int p, int r)// 划分 11 { 12 int x = A[r]; 13 int i = p - 1; 14 for (int j = p; j < r; j++) 15 { 16 if (A[j] < x) 17 { 18 i++; 19 swap(A[i],A[j]); 20 } 21 } 22 swap(A[i+1],A[r]); 23 return (i+1); 24 } 25 int Rand(int M, int N)//实现区间为[M,N]的随机数 26 { 27 return (int)((double)rand() / (double)RAND_MAX*(N - M + 1) + M); 28 } 29 int Randmom_Partion(int *A, int p, int r)//划分的随机版本 30 { 31 int x = Rand(p,r); 32 swap(A[r],A[x]); 33 return Partition(A, p, r); 34 } 35 int Random_Select(int *A, int p, int r, int i)//随机选择 36 { 37 if (p == r) 38 return A[p]; 39 int q = Randmom_Partion(A,p,r); 40 int k = q - p + 1; 41 if (k == i) 42 return A[q]; 43 else if (i < k) 44 return Random_Select(A, p, q - 1, i); 45 else 46 return Random_Select(A, q + 1,r, i - k);//当在右侧时,注意修改下一次i值 47 48 } 49 int main() 50 { 51 int A[] = {2,4,1,3,5,100,6,6,2,102}; 52 int N = sizeof A / sizeof A[0]; 53 srand((int)time(0));//必须放在调用前,不可放到产生随机数的函数中 54 cout << Random_Select(A,0,N-1,8)<<endl; 55 56 }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。