作法:使用最快排序算法,选择快排 或 堆排算法
时间复杂度:O(n*logn) + O(K) = O(n*logn)数组
作法:使用 选择排序 或 冒泡排序,进行K次选择,可获得第k大的数ui
时间复杂度:O(n*k)spa
作法:使用计数排序,另开辟一个数组,记录每一个整数出现的次数,而后再从大到小取最大的 K 个。3d
缺点:code
一、有些数没有出现过,仍要为其保留一个空间,空间浪费比较严重排序
二、不能处理浮点数io
写文章的时候才发现本身把大小搞错了。。。。。。编译
代码实现的是查找最大的K个元素,题目要求的是最小的K个元素。class
额,整我的都很差了。
代码以下(GCC编译经过):
#include "stdio.h" #include "stdlib.h" #define MAXSIZE 10 #define k 5 void QuickSort(int a[],int l,int r);//解法一 void BubbleSort_k(int a[],int n);//解法二 void BucketSort(int a[],int n,int maxval);//解法三 int main(void) { int i,a[MAXSIZE]; srand((unsigned)time(NULL)); printf("数组为:"); for(i = 0;i<MAXSIZE;i++) { a[i] = rand()%101; printf("%3d",a[i]); } // BubbleSort_k(a,MAXSIZE); // QuickSort(a,0,MAXSIZE-1); BucketSort(a,MAXSIZE,100); // printf("\n最大%d个数是:",k); // for(i = MAXSIZE-1;i>=MAXSIZE-k;i--) // printf("%3d",a[i]); printf("\n"); return 0; } void QuickSort(int a[],int l,int r) { int i = l,j = r,x =a[l]; if(l<r) { while(i<j) { while(i<j && a[j]> x) j--; if(i<j) a[i++] = a[j]; while(i<j && a[i]<x) i++; if(i<j) a[j--] = a[i]; } a[i] = x; QuickSort(a,l,i-1); QuickSort(a,i+1,r); } } void BubbleSort_k(int a[],int n) { int i,j,t; for(i=n-1;i>n-6;i--) for(j=i-1;j>=0;j--) if(a[i]<a[j]) { t = a[i]; a[i] = a[j]; a[j] = t; } } void BucketSort(int a[],int n,int maxval) { int i,j,cnt; int bucket[maxval+1]; for(i = 0;i<=maxval;i++) bucket[i] = 0; for(i = 0;i<n;i++) bucket[a[i]]++; //printf("%3d",bucket[i]); printf("\n最大的%d个数是:",k); for(i = maxval,cnt = 0;i>=0;i--) for(j = bucket[i];j > 0 && cnt<k; j--) { printf("%3d",i); ++cnt; } }