求N個數中最大的K個數的幾種方法與實現

2021-06-16 13:37:38 字數 2736 閱讀 1768

**

某筆試題:記憶體中有乙個長陣列,有100w條記錄, 每個記錄為乙個struct array, sizeof( array ) = 512, 在這個struct裡有乙個int型成員變數weight, 現要取得按個weight值從大到小排序的前500個陣列單元(求n裡的前k個大的數)

直接貼**吧,廢話少講(先說方法吧)~~~~解釋在注釋裡:)

const static long n = 10000000;

const static long k = 100;

static long cnt;

struct elem

long weight;

//char data[512];

};void main()

//計數器

++cnt; 

}  //交換到前面

memcpy( &t, &src[idx], sizeof(elem) ); 

memcpy( &src[idx],  &src[l], sizeof(elem) ); 

memcpy( &src[l],  &t, sizeof(elem) ); 

}  } 

//解法二: 部分快排

//前置宣告

int partpartion( elem * src, int start, int end ); 

//部分快排,實現將前k個最大的放在前端(n個無素無序)

//完成後前k個最大數將會放在陣列的前k的位置,無序

void partquicksort( elem * src, int start , int end, int k  ) 

}  //部分快排的分解

int partpartion( elem * src, int start, int end ) 

}  memcpy( &t, &src[i], sizeof(elem) ); 

memcpy( &src[i],  &src[start], sizeof(elem) ); 

memcpy( &src[start],  &t, sizeof(elem) ); 

++cnt; 

return i; 

}  //對前n個元素進行快排

void quicksort( elem * src, int start , int end  ) 

}  //解法三: 將乙個k個資料的堆,遍歷一次即可,以最小堆形式,這樣只要比較第乙個元素f, 如果比f大,就替找f,之後調整堆

//同樣演算法複雜度為 o(n* log2(k) ), 而且實現簡單

//前置宣告

bool adjheap( int * warray, int i, int len ); 

void minheap( int * warray, int len ); 

void heapsort( int * warray, int len ); 

void heapk( elem * src, int k ) 

}  //最後weight陣列為前k個最大的元素,如果要排序輸出,那麼要做一次堆排序

heapsort( weight, k  ); 

for( i=0; icout<< weight[i] << " "; 

cout<

delete weight; 

}  void heapsort( int * warray, int len ) 

}  bool adjheap( int * warray, int i, int len ) 

}  return change; 

}  void minheap( int * warray, int len ) 

//解法四: 如果加上限制條件(1) 所有數為整數 (2) 所有數的變化範圍不大 這樣就可以利用記數排序法的思想

//遍歷一次n, 找出最大值max

//開乙個陣列 t[max];

//再遍歷一次n, 對每個數計數 t[ a[i] ]++; ( 0<= i <= n )

//由於是求前k個最大的數,所以就可以從後面起取

void countsort( elem * src, int k ) 

//開乙個陣列 t[max];

int * t = new

int[ max + 1 ]; 

memset( t, 0, sizeof(int)*(max + 1) ); 

//再遍歷一次n, 對每個數計數 t[ a[i] ]++; ( 0<= i <= n )

for( i=0; i 

//由於是求前k個最大的數,所以就可以從後面起取

int n = k; 

int idx = 0; 

for( i = max; i>0 ; i-- ) 

break; 

}  else

n -= t[i]; 

}  } 

//輸出結果

for( j =0; jcout<" "; 

cout<< gettickcount() - take delete karray; 

}  //輸出

void printelem( elem * src, int len )   

呵呵,相信在面試時能詳細說出以上幾鐘演算法的優缺點,並現場寫出一兩個,估計他會當場拍板:我找的就是你!

呼~~~當時就是衰在這個上啦, 所以決定完整的做一遍, 基礎還是很重要的!!大家也加油啦~~~

求N個數中最大的K個數的幾種方法與實現

某筆試題 記憶體中有乙個長陣列,有100w條記錄,每個記錄為乙個struct array,sizeof array 512,在這個struct裡有乙個int型成員變數weight,現要取得按個weight值從大到小排序的前500個陣列單元 求n裡的前k個大的數 直接貼 吧,廢話少講 先說方法吧 解釋...

求N個數中最大的K個數的幾種方法與實現

某筆試題 記憶體中有乙個長陣列,有100w條記錄,每個記錄為乙個struct array,sizeof array 512,在這個struct裡有乙個int型成員變數weight,現要取得按個weight值從大到小排序的前500個陣列單元 求n裡的前k個大的數 直接貼 吧,廢話少講 先說方法吧 解釋...

找出N個整數中最大的K個數

所謂 第 前 k大數問題 指的是在長度為n n k 的亂序陣列中s找出從大到小順序的第 前 k個數的問題。解法1 我們可以對這個亂序陣列按照從大到小先行排序,然後取出前k大,總的時間複雜度為o n logn k 解法2 利用選擇排序或互動排序,k次選擇後即可得到第k大的數。總的時間複雜度為o n k...