|
发表于 2013-5-16 21:41:56
|
显示全部楼层
- #include <iostream>
- #include <algorithm>
- #include <cstdlib>
- #include <cstdio>
- #include <ctime>
- using namespace std;
- const int TOTAL = 6250000;
- struct MyData{
- int data;
- int index;
- };
- inline bool small( const MyData& m1, const MyData& m2 ) {
- return m1.data < m2.data;
- }
- void MySort( MyData* first, MyData* middle, MyData* beyond ) {
- make_heap(first, middle, small);
- for (MyData* i = middle; i < beyond; ++i) {
- if (small(*i, *first)) {
- //若遍历到比大根堆顶小的元素
- //将此元素和堆顶对调
- //并维持堆的特性
- MyData tmp = *i;
- *i = *first;
- ptrdiff_t hole = 0;
- ptrdiff_t number = middle - first;
- ptrdiff_t j = hole;
- ptrdiff_t k = 2 * hole + 2;//k是hole的右儿子节点
- for (; k < number; k = 2 * k + 2) {
- if (small(*(first + k), *(first + (k - 1)))) --k;
- *(first + hole) = *(first + k), hole = k;
- }
- if (k == number)
- *(first + hole) = *(first + (k - 1)), hole = k - 1;
- for (ptrdiff_t m = (hole - 1) / 2; j < hole && small(*(first + m), tmp);
- m = (hole - 1) / 2)
- *(first + hole) = *(first + m), hole = m;
- *(first + hole) = tmp;
- }
- }
- //现在堆中的元素是数组中的最小元素
- //将堆排序即可
- sort_heap(first, middle, small);
- }
- int main () {
- int i;
- struct MyData *pData = (struct MyData*)malloc( sizeof(struct MyData) * TOTAL );
- FILE* fp = fopen("1.txt", "rb") ;
- for( i=0;i<TOTAL;++i ) {
- fread ( &pData[i].data, sizeof(int), 1 , fp) ;
- pData[i].index = i;
- }
- fclose( fp );
- time_t start, finish;
- start = clock();
- MySort(pData, pData+50, pData+TOTAL);
- finish = clock();
- for( i=0;i<50;++i ) {
- cout<<pData[i].data<<":"<<pData[i].index<<endl;
- }
- cout<<"time:"<<((double)(finish - start)/CLOCKS_PER_SEC)<<endl ;
- free(pData);
- }
复制代码 我把“我是师兄”的代码优化了下,把对50个元素的每次排序去掉,将这50个元素构成一个大根堆,每次都维护这个堆,得到以上程序(是C++的代码,为了直接使用建堆和堆排序函数,其它的基本还是兼容C代码),速度似乎快了不少。
|
|