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