中位数与顺序统计量
一:最小值和最大值
在有n個元素的集合中如果想找最小值,最優也就是n-1次,但如果同時找最大值和最小值,最優可以不是2(n-1)次而是3*(n/2)次,基本思路是成對的比較,先兩個數之間比較,較小值與最小值比較,較大值與最大值比較,注意奇數偶數要分開討論。
#include<iostream> #include<algorithm> using namespace std;int main() {int size;cin >> size;int *p = new int[size];for (int i = 0; i < size; i++)cin >> p[i];int MIN, MAX;if (size % 2 == 1)//奇偶要分開來討論,奇數直接將p[0]作為最大和最小值,后面成對比較{MIN = MAX = p[0];for (int i = 1; i < size; i += 2){int tempmin, tempmax;if (p[i] > p[i + 1]){tempmin = p[i + 1];tempmax = p[i];}else{tempmin = p[i];tempmax = p[i + 1];}MIN = min(tempmin, MIN);MAX = max(tempmax, MAX);}}else{MIN = min(p[0], p[1]);MAX = max(p[0], p[1]);for (int i = 2; i < size; i += 2){int tempmin, tempmax;if (p[i] > p[i + 1]){tempmin = p[i + 1];tempmax = p[i];}else{tempmin = p[i];tempmax = p[i + 1];}MIN = min(tempmin, MIN);MAX = max(tempmax, MAX);}}cout << "max=" << MAX << endl;cout << "min=" << MIN << endl;delete[] p;return 0; }二:期望為線性時間的選擇算法
要從n個元素的集合中選出第i大的元素,基本思路是利用快排中的Partition函數,這個函數調用后可以知道某一個數的大小在集合中具體的位置,這樣經過二分就可以遞歸用線性時間得到第i大的元素。因為這里只要取其中一支遞歸,所以RandSelect的T(n)=O(1),總期望運行時間只有Partition的O(n)。#include<iostream> #include<algorithm> using namespace std;int Partition(int a[], int p, int r); int RandSelect(int a[], int p, int r, int pos);int main() {int n,pos;cout << "Enter the length of array and the specific elements" << endl;cin >> n;int *a = new int[n+1];for (int i = 1; i <= n; i++)cin >> a[i];cout << "Enter the position of number you want to select" << endl;cin >> pos;int ans=RandSelect(a, 1, n, pos);cout << "the answer is " << ans << endl;delete[] a;return 0; }int RandSelect(int a[], int p, int r, int pos) {if (p == r)return a[p];int q = Partition(a, p, r);int k = q - p + 1;//已知的排第k的數if (pos == k)return a[q];else if (pos < k)return RandSelect(a, p, q - 1, pos);elsereturn RandSelect(a, q + 1, r, pos-k); } int Partition(int a[], int p, int r)//就是快排的分區函數 {int x = a[r];int i = p - 1;for(int j=p;j<r;j++)if (a[j] <= x){i++;swap(a[i], a[j]);}swap(a[i + 1], a[r]);return i + 1; }
轉載于:https://www.cnblogs.com/seasonal/p/10343710.html
總結
- 上一篇: 从配置服务器说起......
- 下一篇: Java编程的逻辑 (29) - 剖析S