精华内容
下载资源
问答
  • 程序设计-N个数的中位数(C++)

    万次阅读 2019-02-28 10:19:02
    * n个数的中位数 - C++ - by Chimomo * * 对于一组有有限个数的数据来说,它们的中位数是这样的一种数:这群数据里的一半的数据比它大,而另外一半数据比它小。 * 计算有限个数的数据的中位数的方法是:把所有...

    分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net

    /*
     * 求n个数的中位数 - C++ - by Chimomo
     *
     * 对于一组有有限个数的数据来说,它们的中位数是这样的一种数:
     * 这群数据里的一半的数据比它大,而另外一半数据比它小。
     *
     * 计算有限个数的数据的中位数的方法是:把所有的同类数据按照大小的顺序排列。
     * 如果数据的个数是奇数,则中间那个数据就是这群数据的中位数;
     * 如果数据的个数是偶数,则中间那2个数据的算术平均值就是这群数据的中位数。
     */
    
    #include <iostream>
    #include <cassert>
    #include <stack>
    #include <math.h>
    
    using namespace std;
    
    int QuickSortOnce(int a[], int low, int high) {
    
        // 将首元素作为枢轴。
        int pivot = a[low];
        int i = low, j = high;
    
        while (i < j) {
    
            // 从右到左,寻找首个小于pivot的元素。
            while (a[j] >= pivot && i < j) {
                j--;
            }
    
            // 执行到此,j已指向从右端起首个小于或等于pivot的元素。
            // 执行替换。
            a[i] = a[j];
    
            // 从左到右,寻找首个大于pivot的元素。
            while (a[i] <= pivot && i < j) {
                i++;
            }
    
            // 执行到此,i已指向从左端起首个大于或等于pivot的元素。
            // 执行替换。
            a[j] = a[i];
        }
    
        // 退出while循环,执行至此,必定是i=j的情况。
        // i(或j)指向的即是枢轴的位置,定位该趟排序的枢轴并将该位置返回。
        a[i] = pivot;
    
        return i;
    }
    
    void QuickSort(int a[], int low, int high) {
        if (low >= high) {
            return;
        }
    
        int pivot = QuickSortOnce(a, low, high);
    
        // 对枢轴的左端进行排序。
        QuickSort(a, low, pivot - 1);
    
        // 对枢轴的右端进行排序。
        QuickSort(a, pivot + 1, high);
    }
    
    int EvaluateMedian(int a[], int n) {
        QuickSort(a, 0, n - 1);
    
        if (n % 2 != 0) {
            return a[n / 2];
        } else {
            return (a[n / 2] + a[n / 2 - 1]) / 2;
        }
    }
    
    int main() {
        int a[9] = {-5, 345, 88, 203, 554, 1, 89, 909, 1001};
        cout << EvaluateMedian(a, 9) << endl;
        return 0;
    }
    
    // Output:
    /*
    203
    
    */
    展开全文
  • 求中位数快速选择算法

    万次阅读 2017-07-11 15:12:56
    分析:于是此题就转化为了求中位数,关于求中位数,可以先排序,然后中间那个就是所,但是为了体现分治的思想,同时追求更高的效率,于是本次用随机选择算法,随机选择算法和快速排序有点像。 随机选择算法求中位...

    实验五    输油管道问题的设计与实现

    [实验目的]

    1、掌握分治算法的基本原理

    2、利用分治策略编程解决输油管道问题

    [实验内容]

    问题描述

    某石油公司计划建造一条由东向西的主输油管道。该管道要穿过一个有n 口油井的油田。从每口油井都要有一条输油管道沿最短路经(或南或北)与主管道相连。如果给定n 口油井的位置,即它们的x 坐标(东西向)和y 坐标(南北向),应如何确定主管道的最优位置, 即使各油井到主管道之间的输油管道长度总和最小的位置?

    1.请给出分析与解答;

    2.给出代码和运行结果;

    3.估算算法的时间复杂度。

    关于确定主管道的最优位置:由于主管道是由东向西,则主管道的铺设位置只和各油井位置的y坐标有关,要求的最优主管道的位置y坐标应是各个油井y坐标的中位数。

    反证法证明之:

    油井数目为奇数:假设主管道的最优位置y坐标值为y_ave,不是各个油井位置y坐标的中位数y_mid,我们可以假设y_ave>y_mid,y坐标小于y_ave的油井数目为m,y坐标大于y_ave的油井数目为n,显然有m>n。当我们将主管道位置下移距离x时(假设此时仍满足y_ave>=y_mid),各油井到主管道之间的输油管道长度总和应增加nx-mx,显然nx-mx<0(m>n),即存在一个比_ave更优的位置使得各油井到主管道之间的输油管道长度总和更小,这与假设矛盾。当y_ave>y_mid时,同理可证。

    油井数目为偶数时:同理可证 。

    分析:于是此题就转化为了求中位数,关于求中位数,可以先排序,然后中间那个就是所求,但是为了体现分治的思想,同时追求更高的效率,于是本次用随机选择算法,随机选择算法和快速排序有点像。

    随机选择算法求中位数:如果是奇数个点,就是中间那个,如果是偶数个点,下面代码求的是中间靠左的那个数,当然油田放在中间靠右的那个也可以,各油井到主管道之间的输油管道长度总和是一样的,随机选择算法和快排差不多,先让第一个数找到对应的位置,比它小的放左边,比它大的放它右边,然后如果被排序的位置是中位数,则返回之,如果中位数的位置小于这个位置,就对左区域进行随机选择算法,反之则对右区域进行随机选择算法。

    测试数据1:

    5

    1 2

    2 2

    1 3

    3 -2

    3 3

    运行结果截图:

     

    测试数据2:

    6
    1 6
    2 -2
    1 3
    3 -2
    3 3
    1 1

    运行结果截图:

     

    时杂度分析:算法的时间复杂度为O(n).

    获取源代码请阅读全文:https://ai.52learn.online/525

    展开全文
  • 算法: 快速求中位数(第k大数)

    千次阅读 2017-04-02 22:19:37
    #include #include int partition(int *a,int l,int r) { int i=l-1; int j=r,temp; int x=a[r]; while(1) { while(a[++i]); while(x[--j]) if(j==l) break; if(i>=j) ... temp=a
    #include<stdio.h>
    #include<stdlib.h>
    int partition(int *a,int l,int r)
    {
    	int i=l-1;
    	int j=r,temp;
    	int x=a[r];
    	while(1)
    	{
    		while(a[++i]<x);
    		while(x<a[--j])
    			if(j==l)
    				break;
    			if(i>=j)
    				break;
    			temp=a[i];
    			a[i]=a[j];
    			a[j]=temp;
    	}
    	temp=a[i];
    	a[i]=a[r];
    	a[r]=temp;
    	return i;
    }
    int getMax(int *a,int l,int r,int k)
    {
    	int i;
    	if(r<=l)
    		return a[l];
    	i=partition(a,l,r);
    	if(i==(k-1))
    		return a[i];
    	else
    		if(i>=k)
    			return getMax(a,l,i-1,k);
    		else
    			return getMax(a,i+1,r,k);
    }
    int main()
    {
    	int i,n,a[10000+16];
    	scanf("%d",&n);
    	for(i=0;i<n;i++)
    		scanf("%d",&a[i]);
    	printf("%d\n",getMax(a,0,n-1,n/2+1));
    }

    展开全文
  • // 利用随机化快速排序带权中位数.cpp : Defines the entry point for the console application. // //中位数:n个元素集合中,第n/2小的元素,如果是偶数个,则选择中间二个的算术平均值。 //带权中位数:对于...
      
    

    // 利用随机化快速排序求带权中位数.cpp : Defines the entry point for the console application.
    //
    //中位数:n个元素集合中,第n/2小的元素,如果是偶数个,则选择中间二个的算术平均值。
    //带权中位数:对于n个互不相同的元素集合x1、x2……xn,其权重依次为w1、w2……wn。按x值排好序后,
    //从第一个元素的权值开始进行权值求和,第一个出现权值和大于等于所有元素的权值和的一半的元素
    //先按利用随机化快速排序算法给关键字排序,然后从排序后元素0开始递推累加每个关键字的权,
    //如果在某一个i时,累加的权大于等于总权的一半,那么这个i就是带权中位数的序号。
    //随机化快速排序的平均时间为nlgn。

    #include "stdafx.h"
    #include "stdafx.h"
    #include<iostream>
    #include<ctime>
    #define N 100
    using namespace std;

    struct Node
    {
     double value;
     double weight;
    };
    Node nodes[N];
     //产生一个随即下标,用其对应的数组元素作为比较标准(即一趟快速的主元)
    int random(int m,int n)                      
    {
      srand((unsigned)time(NULL));
      return m + (rand()%(n-m+1));
    }
    //一趟快速排序
    int qartition(Node *nodes,int begin,int end)   
    {
     
      int i = begin-1,j=begin;
      double x = nodes[end].value;
      while(j<end)
      {
       if(nodes[j].value<=x)
       {
        i++;
        Node temp = nodes[i];
        nodes[i]=nodes[j];
        nodes[j]=temp;
       }
       j++;
      }
      Node temp = nodes[end];
      nodes[end]=nodes[i+1];
      nodes[i+1]=temp;
      return i+1;
    }
     //一趟随机化快速排序
    int random_qartition(Node *nodes,int begin,int end)   
    {
       int q = random(begin,end);
       Node temp = nodes[end];
       nodes[end]=nodes[q];
       nodes[q]=temp;
       return qartition(nodes,begin,end);
    }
    //随机化快速排序
    void random_fast_sort(Node *nodes,int begin,int end)  
    {
     if(begin<end)
     {
           int p = random_qartition(nodes,begin,end);
         random_fast_sort(nodes,begin,p-1);
         random_fast_sort(nodes,p+1,end);
     }
    }
    //得到带权的中位数
    Node GetMidWeight(Node *nodes,int begin,int end,double SumWeight)
    {
     double midSum = 0.0;
     int i;
     for(i=begin;i<=end;i++)
     {
      midSum+=nodes[i].weight;
      if(midSum>=SumWeight/2)
       break;
     }
     return nodes[i];
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
     int cases;
     cout<<"请输入案例个数:"<<endl;
     cin>>cases;
     while(cases--)
     {
      cout<<"请输入数据个数:"<<endl;
      int n;
      cin>>n;
      int i;
      double sum = 0.0;
      cout<<"请输入每一对值和其权值"<<endl;
      for(i=0;i<n;i++)
      {
       cin>>nodes[i].value>>nodes[i].weight;
       sum+=nodes[i].weight;
      }
      random_fast_sort(nodes,0,n-1);
      cout<<"带权中位数为:"<<endl;
      Node node = GetMidWeight(nodes,0,n-1,sum);
      cout<<node.value<<endl;
      cout<<"其权值为:"<<endl;
      cout<<node.weight<<endl;
     }
     system("pause");
     return 0;
    }

     

    展开全文
  • O(n)的时间复杂度求中位数

    千次阅读 2020-09-26 14:45:14
    在开始O(n)时间复杂度求中位数之前,先手写一下快速排序。 快速排序的实现 Reference: 快速排序|菜鸟教程 白话经典算法系列之六 快速排序 快速搞定 快速排序的原理 如果想正序排序一个序列: 从序列中找到一个 ...
  • 从海量数据中找出中位数

    千次阅读 2020-03-14 18:51:32
    题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存)。 关于中位数:...
  • 对于有限的数集,可以通过把所有观察值高低排序后找正中间的一个作为中位数。如果观察值有偶数个,则中位数不唯一,通常取最中间的两个数值的平均数作为中位数中位数寻找的快速算法 一般寻找中位数可以先将数组...
  • 查找中位数(java 快速排序)

    千次阅读 2016-10-31 16:14:39
    对于有限的数集,可以通过把所有观察值高低排序后找正中间的一个作为中位数。如果观察值有偶数个,通常取最中间的两个数值的平均数作为中位数。 java代码:import java.util.*; /** * @version 1.0 * @author ...
  • 快速中位数的算法

    万次阅读 2019-07-14 07:35:59
    众所周知,quick sort的时间复杂度为O(N*log(N)),利用quick sort的原理可以实现经典的找任意...找了一下快速计算中位数的方法,找到一篇有趣的报告:“Fast Median Search: an ANSI C implementation”。这篇报告提...
  • 快速排序找中位数

    千次阅读 2013-12-20 10:39:03
    这个很好理解, 就像找前K个数一样, 这个就像找前n/2个数, 不过这里说只是要中位数就没有必要找完了, 于是就可以大规模的剪枝;剪枝方法就是递归的时候对不可能有中位数的区间就直接减掉, 这个可是很大的一个...
  • 快速排序和寻找中位数复杂度分析

    千次阅读 2019-02-20 09:45:10
    之所以,起“快速排序和寻找中位数”这个题目,并不是因为寻找中位数的时候使用了快速排序,而是这两个算法使用了一个同一个预处理结构 —— 划分,然后都是递归解决!中位数的也是根据一个数把原来的数划分一下,...
  • 100亿个数的中位数

    千次阅读 2019-03-15 23:10:14
    给定100亿个无符号的乱序的整数序列,如何求出这100亿个数的中位数中位数指的是排序后最中间那个数)。 2、解题思路一 一个无符号整数的大小为4B,则100亿个数的大小为40GB,如果内存够大的话可以对这100亿个...
  • 给一个无序数组array和数组长度n,找其中的中位数(这里考虑n为奇数) Sample: ***** Input: ***** @[@(500),@(120),@(7),@(220),@(3),@(8),@(4),@(200),@(100) ***** Output: ***** 100 解法一:将数组...
  • 无序数组的中位数(c语言版本)

    千次阅读 2019-03-22 16:06:41
    在面试时,会经常被问道,如何求解一个无序数组的中位数?很多人往往都会第一感觉就是,先将该数组排序,然后找最中间的那个数,但是这种思路通常的时间复杂度最好是O(nlogn),更糟的情况下会到O(n^2),并不是最优...
  • python:list的中位数

    千次阅读 2016-08-09 23:40:13
    L.sort() n = len(L) m = n/2 if n == 0: print 'None' elif n%2 == 0: print "%.1f"%((L[m]+L[m-1])/2.0) ...给你一个list L, 如 L=[0,1,2,3,4], 输出L的中位数(若结果为小数,则保留一位小数)。
  • 大数据求中位数(插值计算)

    千次阅读 2020-06-15 11:48:24
    在学数学时我们学到过求中位数的方法,在数据个数为偶数时找最中间的两个数然后平均数如果数据个数为奇数时则只需找数据个数一半的那位上的数字即可代表中位数(前提是数组是有序的) java代码如下: public ...
  • 先理解快速排序。 int partition(int L[],int low,int high) { int i,num=low; for(i=low+1;i<=high;i++) { if(L[i]<L[low]) { swap(&L[i],&L[num+1]); num++; } } swap(&L...
  • BFPTR算法n个数中第k大(即第n-1-k小)的数,其思想是基于快速排序中对Partion的pivot值进行优化,快速排序中每一趟快排的pivot的选取一般是数组的首项或者尾项(数值比较随机),而BFPTR是每次选择5分中位数...
  • 一个无序数组的中位数

    千次阅读 2017-08-04 23:13:05
    问题描述一个无序数组的中位数。 如:{2,5,4,9,3,6,8,7,1}的中位数为5,{2,5,4,9,3,6,8,7,1,0}的中位数为4和5。 要求:不能使用排序,时间复杂度尽可能低。 提示:考虑堆或者快排思想解决方法1:堆思路1: 分析...
  • 代码实现三个数中的中位数

    千次阅读 2019-07-14 18:21:41
    1.中位数举例 给定一组数arr1 = [1,3,0,2,6](奇数的情况)其中位数 对arr1根据数值大小重新排列:arr1_new = [0,1,2,3,6] 因此,arr1的中位数为2(2在中间位置) 给定一组数arr2 = [1,3,0,2,6,5](偶数的情况...
  • 快速排序(取中位数法)

    千次阅读 2015-05-19 17:44:23
    #include ...// 首元素、中间元素和尾元素的中位数,将中位数与首元素交换位置 inline void medianAsPivot(int arr[], const int& left, const int& right) { const int middle = left+(right-left)>>1
  • bfptr算法(即中位数中位数算法)

    万次阅读 多人点赞 2018-08-25 22:35:16
    BFPRT算法是解决从n个数中选择第k大或第k小的这个经典问题的著名算法,但很多人并不了解其细节。本文将首先介绍求解这个第k小数字问题的几个思路,然后重点介绍在最坏情况下复杂度仍然为O(n)的BFPRT算法。 一 ...
  • 一个无序数组的中位数

    千次阅读 2017-08-04 16:42:52
    一个无序数组的中位数。如:{2,5,4,9,3,6,8,7,1}的中位数为5,{2,5,4,9,3,6,8,7,1,0}的中位数为4和5。 要求:不能使用排序,时间复杂度尽可低。实现思路:解法一:快排思想【背景知识】 1.快速排序可以实现将...
  • 中位数(C语言)

    万次阅读 2017-06-19 17:50:46
    Description 计算有限个数的数据的中位数的方法是:把所有的同类数据按照大小的顺序...现在给n个正整数,他们的中位数。 Input 第一行:n——数列数字的个数(1。 第二行:有n个正整数,每两个数中间用空格隔
  • 快速排序(基准是中位数

    千次阅读 2017-01-02 11:46:33
    简介: 快排相比冒泡等相对较快,是因为其是跳跃式交换(快,要根据数据量等)下面算法介绍: ①根据数据量,若大于cutoff,则用快排,反之用插入排序 ②先找基准(这里采用中位数),并将基准放在Right-1的位置...
  • 无序数组中位数,数组排序时间复杂度O(N)算法 排序知识回顾
  • 海量数据求中位数

    千次阅读 2009-11-01 16:34:00
    题目描述:若有很大一组数据,数据的个数是N(每个数占4个字节),内存大小为M个字节,其中M转一道网上类似题目的解答: 题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写思路即可...
  • 快速选择无序数列的中位数

    千次阅读 2018-11-03 19:16:07
    设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个)作为关键数据,然后将所有比它小的都放到它前面,所有比它大的都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速...
  • 5亿个数找中位数

    千次阅读 2015-04-20 16:05:03
    首先采用hash() % 100,把数据分到100个文件中,然后对每个文件分别在内存中进行快速排序,再将100个小文件进行合并,并在合并过程中寻找中位数,时间复杂度是O(nlogn)   另外一种方法是,

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 416,122
精华内容 166,448
关键字:

怎么快速求出中位数