求中位数。

来源:互联网 发布:macbook pro windows 编辑:程序博客网 时间:2024/04/28 05:16

//在网上找了好久,没有找到求一个行列均递增二维矩阵的中位数算法,于是自己花了几天的时间去摸索一下求一个数组的中位数算法,本算法不只是求中位数,可以求出你想求/////的///第K小的元素,

//不废话,上代码。。

//要多思考,每一步的思想,即使我没有给出每一步的算法解释,,有疑问的话可以下面评论。。

#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;




int partition(char *s, int p, int r)
{
int tmp = s[r];
int i = p - 1;
for (int j = p; j < r - 1; j++)
{
if (s[j] < tmp)
{
i++;
int temp = s[i];
s[i] = s[j];
temp = s[i];
}
}
int trp = s[i + 1];
s[i + 1] = s[r];
s[r] = trp;
return i + 1;
}






int randomizedpartition(char *s, int p, int r)
{
int i=p + rand() % (r - p + 1);//产生p,r中任意一个随意数字;
int temp = s[r];
s[r] = s[i];
s[i] = temp;
return partition(s, p, r);
}










int randomizedselect(char *s, int p, int r, int i)//输出数组s中第i小的元素。
{
if (p == r)
return s[p];
int q = randomizedpartition(s, p, r);
int k = q - p + 1;
if (i == k)
return s[q];
else
if (i < k)
return randomizedselect(s, p, q - 1, i);
else
return randomizedselect(s, q + 1, r, i - k);
}


//测试函数:
int main()
{


char s[] = {29, 7, 8, 6, 54, 20, 1 };
int num = sizeof(s) / sizeof(s[0]);
int num1 = randomizedselect(s, 0, num - 1, num / 2);
cout << num1 << " ";
return 0;
}

0 0
原创粉丝点击