求无序数组第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个数,一般有以下几种办法:   1.比较排序,然后找最小的k个数,时间复杂度下界为O(nlogn)   2.计数排序,时间复杂度可以做到O(n),但是要看具体的数据情况。也...

小顶堆实现求无序数组中的最大k个数

//建立含有n个元素的小顶堆 void MakeMinHeap(int a[], int n) { for (int i = n / 2 - 1; i >= 0; i--) ...
  • L_inYi
  • L_inYi
  • 2013年03月30日 15:35
  • 692

求无序数组第K大的数值,及其所在的位置

求无序数组第K大的数值,及其所在的位置 #include "stdafx.h" #include #include #include void ...

线性时间O(n)内求数组中第k大小的数

 ——本文为博主原创,转载请注明出处 因为最近做的WSN(wireless sensor network)实验要求用3个传感器节点接受2000个包的数据并算出一些统计量,其中就有算出中位数这么...
  • cmdos
  • cmdos
  • 2016年12月25日 21:06
  • 160

《数组-规划》 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小

一,题目:有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。       例如:            ...

找出无序数组中最小的前k个数

基本思想:在快速排序的基础上进行改进。 具体代码如下:
  • bob908
  • bob908
  • 2014年04月20日 17:09
  • 1654

算法导论:快速找出无序数组中第k小的数

题目描述: 给定一个无序整数数组,返回这个数组中第k小的数。 解析: 最平常的思路是将数组排序,最快的排序是快排,然后返回已排序数组的第k个数,算法时间复杂度为O(nlogn),空间复杂度为O(...
  • tham_
  • tham_
  • 2015年03月29日 14:34
  • 1830

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

写一段程序,找出数组中第k大小的数,输出数所在的位置。 【解法一】 我们先假设元素的数量不大,例如在几千个左右,在这种情况下,那我们就排序一下吧。在这里,快速排序或堆排序都是不错的选择,他...

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

当然如果我们想要实现这个问题会有很多思路,可以将原来的数组进行排序即可,直接随机访问到第K个元素即可。 我们专门写一篇博客当然不是想利用这种思路的,可以试试改进的快速排序啊,对不,我个人觉得是利用了两...
  • dasgk
  • dasgk
  • 2015年07月23日 15:43
  • 951
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:求无序数组第K大小的数值
举报原因:
原因补充:

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