您的位置:首页 > 编程语言

编程之美-2.5寻找最大的K个数

2013-04-12 09:55 288 查看
思路一:

完全排序的方法,快排时间复杂度O(N*lgN)

在这儿就不写代码了

思路二:

假设n个数存在数组S中,从S中随机挑选x,把大于x的数放入Sa,吧小于等于x的数放入Sb,这时分两种情况:

1、Sa中元素个数小于k,Sa中所有数和Sb中最大的k-|Sa|个数(|Sa|指Sa中元素的个数)就是S中最大k个数;

2、Sa中元素个数大于或等于k,则需返回Sa中最大的k个数;

时间复杂度O(N*lgK)

以下代码用python实现,本来以为很简单的程序,调了半天:

总结出以下几点:

1、伪代码实现成代码,还是很难的过程,特别是细节;

2、python还是不熟练;

3、要用好的编译器,像eclipse,python自带的编译器加不了断点;

4、学会加断点调试,输出必要步骤,在编译器里看变量的变化情况

import random

def partition(n):

    print n

    large=[]

    small=[]

    index=random.randint(0,len(n)-1)
    n[0],n[index]=n[index],n[0]     #注意python两个元素的交换方法,不像c,java

    print n

    p=n[0]

    for i in range(1,len(n)):       #注意for中的range

        if n[i] > p:

            large.append(n[i])

        else:

            small.append(n[i])

    if len(large) < len(small):

        large.append(p)

    else:

        small.append(p)

    print "partition : " + str(large) + str(small)

    return (large,small)

def k_max(n,k):

    if k <= 0:

        print "k<=0"

        return []

    if len(n) <= k:

        print "len(n) <= k:"

        return n

    print " len(n) > k: "

    large=[]

    small=[]

    (large,small)=partition(n)

    large_tmp=k_max(large,k)

    print "large_tmp : " + str(large_tmp)

    print "large_tmp length: "+str(len(large_tmp))

    small_tmp=k_max(small,k-len(large))

    print "small_tmp : " + str(small_tmp)

    print "small_tmp length : "+str(len(small_tmp))

    return large_tmp+small_tmp

n=[123,45,5,67,32,8,54,234,123,3,5]
print k_max(n,3)

思路三:

堆排序,非递归的实现,可以试一试递归的

先建堆,然后排序

#include "stdafx.h"

#include <stdio.h>  

#include <stdlib.h>  

#define K 5

#define HEAP_SIZE 10

void print_array(int a[])

{
for(int i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");

}

void build_heap(int a[],int length)

{
int i;
int j;
int k,v;
bool heap;
for(i=length/2-1;i>=0;i--)
{
k=i;
v=a[k];
heap=false;
while((!heap)&&((2*k+1)<length))
{
j=2*k+1;
if(j<(length-1))
   if(a[j]<a[j+1])
j++;
if(v>=a[j])
heap=true;
else 
{
a[k]=a[j];
k=j;
}
a[k]=v;
print_array(a);
}

}

}

void get_max_k(int a[],int length,int k)

{
int b[HEAP_SIZE];
int i,j;
int tmp;
for(i=k-1,j=0;i>=0;i--,j++)
{
b[j]=a[0];
tmp=a[HEAP_SIZE-1-j];
a[HEAP_SIZE-1-j]=a[0];
a[0]=tmp;
build_heap(a,HEAP_SIZE-1-j);
}

    print_array(b);

     

}

int main()

{
/*
int a[6];
int n=6;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",a+i);

*/
int a[HEAP_SIZE]={2,9,3,5,5,5,1,1,2,3};
print_array(a);
build_heap(a,HEAP_SIZE);
get_max_k(a,HEAP_SIZE,5);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: