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

思路一:

完全排序的方法,快排时间复杂度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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值