作法:使用最快排序算法,選擇快排 或 堆排算法
時間複雜度: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; } }