尋找最小的K個數 yuan

2021-06-27 08:44:27 字數 1743 閱讀 2452

1.快速排序,找到第k個最小的數,輸出1到k。

/* 對三種情況進行處理:(m = pos - left + 1) 

1、如果m=k,即返回的主元即為我們要找的第k小的元素,那麼直接返回主元array[i]即可; 

2、如果m>k,那麼接下來要到低區間array[left....pos-1]中尋找,丟掉高區間; 

3、如果m#include

using namespace std;  

int my_rand(int low, int high)    

// 以最末元素作為主元對陣列進行一次劃分  

int partition(int *arr,int beg,int end)  

swap(arr[pos], arr[end]);  

return pos;  

}// 以線性時間返回陣列array[beg....end]中第k小的元素  

int random_select(int array, int beg, int end, int k)      

else   

return random_select(array, mid + 1, end, k - m);  

} int rand_select(int array, int beg, int end, int k)    

else   

return random_select(array, mid + 1, end, k - m);  

} int main()  

;     int  len=sizeof(array)/sizeof(int);

random_select(array, 0,len-1, 4) ;

// rand_select(array, 0,len-1, 4) ;

for(int i=0;i<4;i++)

cout< return 0;  

}  

2.二分搜尋演算法

#include

using namespace std;  

// 以最末元素作為主元對陣列進行一次劃分  

int partition(int *arr,int beg,int end)  

swap(arr[pos], arr[end]);  

return pos;  

}int median_select(int array, int beg, int end, int k)    

else   

return median_select(array, mid + 1, end, k - m);  

} int main()  

;  int  len=sizeof(array)/sizeof(int);

median_select(array, 0,len-1, 4) ;

for(int i=0;i<4;i++)

cout} 3.最大堆,建立乙個k元素的最大堆,用arr的前k個元素初始化,然後從arr的第k+1個元素

開始掃瞄陣列,如果小於最大堆的根,則互換元素,並對根做maxheap_fy,這樣最後最大堆裡剩的就是最小的k個元素.時間複雜度:o(nlogk)

#include using namespace std;

void maxheap_fy(int *heap,int index,int heapsize) }

void maxk2(int *arr,int size,int k)

{ if(size

尋找最小的k個數

尋找最小的k個數 在乙個長度為n的陣列中,尋找最小的k個數。最大的k個數解法類似 想法比較簡單,先對n個數排序,再輸入前面k個數,即可。這種方法的時間複雜度比較大。假設我們使用快排,需要o nlogn 然後輸出k個數需要o k 一共要o nlogn 略。這種方法比較好,演算法簡單,易於實現。先把陣列...

尋找最小的k個數

輸入n個整數,輸出其中最小的k個。要求乙個序列中最小的k個數,按照慣有的思維方式,則是先對這個序列從小到大排序,然後輸出前面的最小的k個數。至於選取什麼的排序方法,我想你可能會第一時間想到快速排序 我們知道,快速排序平均所費時間為n logn 然後再遍歷序列中前k個元素輸出即可。因此,總的時間複雜度...

尋找最小的 k 個數

輸入n個整數,輸出其中最小的k個。使用排序的方法來解決該問題。快速排序所費時間複雜度為o n logn 排序完成過後,只需要取前k個數值即是最小的k個數。int array const int length sizeof array sizeof array 0 void printarray in...