**
某筆試題:記憶體中有乙個長陣列,有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...