2009-07-27 10:08
211人閱讀收藏
舉報網上看到乙個面試題, 題目是這樣的:在一百萬個浮點資料中找到前100個最大的數!由於資料結構的知識在大學期間沒有開專業的課程,而只是在工作後陸陸續續學習了些,很多學得不紮實。因此借這個機會把排序的10來種演算法好好學習了下。
借鑑《程式設計之美》的分析思路,我把這個演算法用c**實際實現了下。詳細請看源**:
#include
#include
#define num 1000000 //百萬大軍過江
#define max_ahead 100 //找出前100者
int adjust( int b, int beg, int end )
if( t < b[j] )
break;
b[ (j-1)/2 ] = b[j];
j = j*2 + 1;
}j = ( j-1 ) / 2;
b[j] = t;
return 1;
}int main( void )
//組建乙個max_ahead大小陣列
for( i = 0; i < max_ahead; i++ )
//將這max_ahead大小的陣列組成最小堆二叉完全樹
for( i = max_ahead / 2 - 1; i >= 0; i-- )
//將後面的資料與二叉樹最頂端那個最小值做比較
//如果比max_ahead中最小的還大的話就插進去,否則就跳過
//這樣下來,它的整個複雜度就會降低很多
//大小為:o( n*long( max_ahead )
for( i = max_ahead; i < num; i++ )
}printf( "前%d個最大的值:/n",max_ahead );
for( i = 0; i < max_ahead; i++ )
if( a )
free( a );
if( b )
free( b );
return 0;
}
排序應用 快速排序,堆排序
題外話很多人都認為 包括過去的筆者 排序演算法各種程式語言都有實現,我們就沒必要再去造輪子了,所以再更多的時候就會忽略它們的應用場景和思想。這裡,筆者的觀點是,改造的輪子還是要造的。有乙個這樣的問題 後續就稱呼為topk問題 給定乙個陣列,返回前k個最小值,返回的陣列順序沒有要求,當然,k小於陣列長...
堆排序演算法及其應用
堆積排序是指利用堆積樹 堆 這種資料結構所設計的一種排序演算法,可以利用陣列的特點快速定位指定索引的元素。堆可以被看成是一棵樹,結點在堆中的高度可以被定義為從本結點到葉子結點的最長簡單下降路徑上邊的數目 定義堆的高度為樹根的高度。我們將看到,堆結構上的一些基本操作的執行時間至多是與樹的高度成正比,為...
堆排序實現及應用
堆排序 heapsort 是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質 即子結點的鍵值或索引總是小於 或者大於 它的父節點。一般都用陣列來表示堆,i結點的父結點下標就為 i 1 2。它的左右子結點下標分別為2 i 1和2 i 2。如第0個結點左右...