算法导论_第九章_中位数和顺序统计量

算法导论_第九章_中位数和顺序统计量


最小值和最大值


在一个有n个元素的集合中,至少要n-1次比较才能找到最小值或最大值。


如果同时找最大值和最小值,只需要3*(n/2)次比较,因为对于两个数,首先对这两个数

进行比较,较大的一个与最大值比较,较小的一个与最小值比较,这样就找到了最大最

小值。


期望为线性的选择算法


利用快排中的分治思想找到第i大的数字


下面上代码:

/*************************************************************************
	> File Name: randomized_select.cpp
	> Author:chudongfang 
	> Mail:[email protected] 
	> Created Time: 2016年06月29日 星期三 16时17分58秒
 ************************************************************************/

#include
#include
#include
#include
#include
#include 
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
int randomized_select(int A[],int p,int r,int i);
int randomized_partition(int A[],int p,int r);
void swap(int *x,int *y){int t;  t=*x;  *x=*y;   *y=t; }
int main(int argc,char *argv[])
{
    int A[100];
    int n,m;
    printf("please input the number of array:");
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&A[i]);
        
    printf("please input the number you want get:");
    scanf("%d",&m);
    printf("%d",randomized_select(A,1,n,m));
    
    return 0;
}

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) //如果正好为第i大的元素,返回
        return A[q];
    else if(i



经分析,其时间为线性的,O(n)





最坏情况为线性时间的算法SELECT


1.将输入数组的n个元素划分为[n/5]组,每组5个元素,且至多只有一组由剩下nmod 5

2.插入排序寻找中位数

3.2中找出的中位数递归调用SELECT,找出其中的中位数

4.3找出的中位数进行划分

5.如果i==k返回,i在低位区间递归调用SELECT i>k在高位区间递归调用SELECT


其时间复杂度


T(n)=T(n/5)+T(7*n/10+6)+O(n)


其中T(7*n/10+6)是因为步骤5中的最多要在7*n/10+6个数中进行查找


经计算,其时间复杂度为:

O(n)

你可能感兴趣的:(算法,算法导论,笔记)