求无序数组第K大小的数值

原创 2012年03月22日 16:01:56
#include "stdafx.h"
#include <time.h>
#include <stdio.h>
#include <stdlib.h>


void swap(int & a, int & b);
int find_position(int* a,int k, int low,int high);
int find_orderk(int* a, int k, int low,int high);

void swap(int & a, int & b)
{
    int tmp = a;
    a = b;
    b = tmp;
}

int find_position(int* a,int k, int low,int high)
{
    if (low >= high)
    {
        return low;
    }
    
    int m = rand() % (high - low) + low;
    int tmp =  a[m];
    int p = m;

    int lowpos = low;
    bool bfindlow = false;
    for (int i = low; i < m; i++)
    {
        if (a[i] >= tmp && bfindlow)
        {    
            swap(a[lowpos++], a[i]);
        }
        else if(a[i] < tmp && !bfindlow)
        {
            lowpos = i;
            bfindlow = true;
        }
    }

    if (bfindlow)
    {
        swap(a[lowpos], a[m]);
        p = lowpos;
    }

    int highpos = p;
    lowpos = p+1;
    bool bfindhigh = false;    
    for (int i = m+1; i <= high; i++)
    {
        if (a[i] >= tmp)
        {
            highpos = i;
            if (!bfindhigh)
            {
                bfindhigh = true;
            }

            if(bfindlow)
            {
                highpos = lowpos;
                swap(a[lowpos++], a[i]);
            }        
        }
        else
        {
            if(!bfindlow)
            {
                bfindlow = true;
                lowpos = i;
            }
        }
    }

    if(bfindhigh)
    {
        swap(a[p], a[highpos]);
        p = highpos;
    }

    return p;
}


int find_orderk(int* a, int k, int low,int high)
{
    int p = find_position(a, k-1+low, low, high);
    
    if(p-low < k-1)
    {
        p = find_orderk(a, (k-1)-(p-low), p+1, high);
    }
    else if (p-low > k-1)
    {
        p = find_orderk(a, k, low, p-1);
    }

    return p;
}

int main ()  
{
    srand((unsigned) time(NULL));
    int k = 1;
    while (k <= 10)
    {
        int a[10]={9,11,6,2,8,12,7,3,20,1};
        int p = find_orderk(a, k, 0, 9);

        printf("\n NO. %d  VALUE : %d\n", k, a[p]);
        k++;
    }
    return 0;
}





无序数组求第K大

对于第k大,我们可以用堆排序求前k大,还可以用快速排序的思想,求出第k大,我们会发现,当求出的下角标等于我们想要的k时,就是第k大元素了. import java.util.Scanner; p...
  • wang57389675
  • wang57389675
  • 2016年09月19日 10:21
  • 450

寻找无序数组中第k大的数

对于一个无序的数组,怎样找到其中第k大的数呢?下面总结几种方法。1.直接排序法使用常见的归并排序、堆排序等算法对数组进行排序,然后找到第k大的数。排序算法的时间复杂度为O(nlogn),所以算法总的时...
  • yc461515457
  • yc461515457
  • 2016年04月18日 10:39
  • 2483

由无序数组中找到第K 大的元素

当然如果我们想要实现这个问题会有很多思路,可以将原来的数组进行排序即可,直接随机访问到第K个元素即可。 我们专门写一篇博客当然不是想利用这种思路的,可以试试改进的快速排序啊,对不,我个人觉得是利用了两...
  • dasgk
  • dasgk
  • 2015年07月23日 15:43
  • 1041

java 实现从无序数组中 找出第k大的数, 无序数组充许有重复元素

要求找出第几名的元素是什么(找出B[i]的值)? 找出第k名的元素的值。          先从A中随机一个下标index1, 然后进行一趟快速排序等到新数组A1,排完了就知道index1对应的...
  • woshisap
  • woshisap
  • 2012年05月05日 23:45
  • 4453

寻找无序数组中的第K大数和前K大数

两个问题互相可以转化。如果可以找到第K大数,那么只再需要O(N)就可以找齐剩余的前K大数。如果可以找到前K大数,那么只再需要O(K)就可以找到第K大数。 先排序,在找第K个。O(NlgN) ...
  • logic_nut
  • logic_nut
  • 2012年11月03日 13:29
  • 3062

整数无序数组求第K大数(暴力|快排) - 滴滴出行2018校园招聘内推笔试-研发工程师

给定无序整数序列,求第K大的数,例如{45,67,33,21},第2大的数为45
  • a389850155
  • a389850155
  • 2017年08月26日 18:51
  • 156

经典算法题:无序整数数组中找第k大的数

经典问题:写一段程序,找出数组中第k大的数,输出数所在的位置。 【解法一】先排序,然后输出第k个位置上的数 我们先假设元素的数量不大,例如在几千个左右,在这种情况下,那我们就排序一下吧。在这里,快速...
  • wangbaochu
  • wangbaochu
  • 2016年10月27日 21:02
  • 4099

不排序,两种方法找到无序数组的最大K个数

虽然不排序,这这两种方法都源于经典的排序算法的扩展   方式一,快速排序的扩展 /*********************************************************...
  • shouhuqi
  • shouhuqi
  • 2012年09月27日 14:25
  • 4906

在一个无序数组中找到第K个最小或者最大的元素

给定一个长度为n的无序数组,找出这个数组中第k个最小或者最大的元素,其中0 最简单的方法就是先对数组进行排序,然后返回第k个元素。代码如下: // Simple C++ program to ...
  • sinat_36246371
  • sinat_36246371
  • 2017年01月03日 10:14
  • 758

无序数组中找到第K小的数(或者找到最小的K个数)

题目:在一个很大的无序数组中用最快的速度找到第K小的数(或者找到最小的前K个数)。(类似于,在一个有1000000个数的数组中找到最小的100个数)对于这个问题首先想到的可能是把这个数组进行按从小到大...
  • wangbingcsu
  • wangbingcsu
  • 2016年04月25日 12:15
  • 3483
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:求无序数组第K大小的数值
举报原因:
原因补充:

(最多只允许输入30个字)