中值问题O(N)算法C++源码
来源:互联网 发布:阿里云服务器升级配置 编辑:程序博客网 时间:2024/05/22 15:34
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <algorithm>
using namespace std;
void swap(int A[], int i, int j) {
if (i != j) {
int t = A[i];
A[i] = A[j];
A[j] =t;
}
}
int partition(int A[], int p, int r) {
int x = A[r];
int i = p - 1;
for (int j = p; j <= r-1; j++) {
if (A[j] <= x) {
i++;
swap(A, i, j);
}
}
swap(A, i+1, r);
return i+1;
}
int randomized_partition(int A[], int p, int r) {
srand(time(NULL));
int i = p + rand() % (r-p+1);
swap(A, i, r);
return partition(A, p, r);
}
int randomized_select(int A[], int p, int r, int i) {
if (p == r)
return A[p];
int q = randomized_partition(A, p, r);
int k = q - p + 1;
if (i == k)
return A[q];
else if (i < k)
return randomized_select(A, p, q-1, i);
else
return randomized_select(A, q+1, r, i-k);
}
void triplet_adjust(int A[], int i, int step) {
int j = i + step;
int k = i + 2 * step;
if (A[i] < A[j]) {
if (A[k] < A[i])
swap(A, i, j);
else if (A[k] < A[j])
swap(A, j, k);
}
else {
if (A[i] < A[k])
swap(A, i, j);
else if (A[k] > A[j])
swap(A, j, k);
}
}
double mean(int A[], int n) {
double f = A[0];
for (int i = 1; i < n; i++)
f += A[i];
return f / n;
}
int approximate_median(int A[], int r) {
int step = 1;
int size = 1;
int i;
for (int j = 0; j < r; j++)
size *= 3;
for (int k = 0; k < r; k++) {
i = (step - 1) / 2;
while (i < size) {
triplet_adjust(A, i, step);
i += (3 * step);
}
step *= 3;
}
return A[(size-1)/2];
}
void selection_sort(int A[], int left, int size, int step) {
int min;
int i, j;
for (i = left; i < left + (size-1) * step; i += step) {
min = i;
for (j = i+step; j < left + size; j += step) {
if (A[j] < A[min])
min = j;
}
swap(A, i, j);
}
}
const int SORT_NUM_THRESHOD = 50;
int approximate_median_any_n(int A[], int size) {
bool left_to_right = false;
int left = 0;
int step = 1;
int i;
while (size > SORT_NUM_THRESHOD) {
left_to_right = !left_to_right;
int rem = size % 3;
if (left_to_right)
i = left;
else
i = left + (3 + rem) * step;
for (int j = 0; j < (size / 3 - 1); j++) {
triplet_adjust(A, i, step);
i += 3 * step;
}
if (left_to_right)
left += step;
else {
i = left;
left += (1 + rem) * step;
}
selection_sort(A, i, 3 + rem, step);
if (rem == 2) {
if (left_to_right)
swap(A, i+step, i+2*step);
else
swap(A, i+2*step, i+3*step);
}
step *= 3;
size = size / 3;
}
selection_sort(A, left, size, step);
return A[left + step * int( (size-1) / 2 )];
}
int main(int argc, char* argv[])
{
const int DEFAULT_N = 1000000;
int N;
if (argc < 2) {
N = DEFAULT_N;
}
else {
N = atoi(argv[1]);
}
cout << "N = " << N << endl;
clock_t t = clock();
cout << clock() << endl;
int* A = new int[N];
cout << clock() << endl;
srand(time(NULL));
for (int i=0; i<N; i++) {
A[i] = rand() % N;
}
clock_t t1 = clock();
cout << t1 << endl;
double avg = mean(A, N);
cout << avg << endl;
clock_t t2 = clock();
cout << t2 << endl;
int m = approximate_median_any_n(A, N);
cout << m << endl;
clock_t t3 = clock();
cout << t3 << endl;
m = randomized_select(A, 0, N-1, N/2);
cout << m << endl;
clock_t t4 = clock();
cout << t4 << endl;
std::sort(A, A+N);
m = A[N/2];
cout << m << endl;
clock_t t5 = clock();
cout << t5 << endl;
cout << endl;
double dt = (double) (t2-t1) / CLOCKS_PER_SEC;
cout << dt << " " ;
dt = (double) (t3-t2) / CLOCKS_PER_SEC;
cout << dt << " " ;
dt = (double) (t4-t3) / CLOCKS_PER_SEC;
cout << dt << " " ;
dt = (double) (t5-t4) / CLOCKS_PER_SEC;
cout << dt << " " ;
cout << endl;
}
- 中值问题O(N)算法C++源码
- 中值问题O(N)算法研究
- 约瑟夫问题o(n)算法
- 约瑟夫问题-O(n)算法实现
- 排列组合数C(m,n)的O(n)算法
- 约瑟夫问题,从o(n*m)到o(n)乃至o(m)的算法复杂度进阶
- 约瑟环问题(O(n)简单算法)多种算法
- 《数据结构》2.10设计一个算法,删除顺序表中值为item的元素,要求算法的时间复杂度是O(n),空间复杂度是O(1)
- 多重背包问题 可行性问题O(V N) 算法
- 《编程之美》中买书问题算法。空间复杂度O(n),时间复杂度O(n),求挑战
- ST算法_求RMQ问题_时间复杂度O(n*log2(n))+O(1)
- 设计算法,在O(n)时间内求解分数背包问题
- 3-SUM问题的O(n²)算法
- floyd 算法(o(n*n*n)
- 贪心算法;部分背包问题;快速排序O(nlgn);贪心算法O(n);
- 多重背包问题的三种复杂度解法,O(n * w * c)、O(n*w*log c)和O(n * w)。
- Max Subsequence Sum 最大子序列和问题 O(NlogN)与O(N)算法的对比
- 2-SAT问题相关算法与题目讲解(O(n*m)与O(m))
- MATLAB图像处理-张卫平(节选)
- 给我一个理由忘记 那么爱我的你
- NH一对一(单向主键关联映射)
- 类的加载机制 1
- 最给力的城市大闹铃
- 中值问题O(N)算法C++源码
- 基于CPLD的高分辨率AD转换电路设计
- VC6环境下USB编程链接错误解决办法
- 汇编基础--cmp汇编指令
- Linux下的调试工具
- 2011-1-25
- Jquery ajax 实例
- HACMP学习笔记
- Java volatile(转)