參考部落格:
1、問題描述:
輸入:乙個最多含有n個不重複的正整數(也就是說可能含有少於n個不重複正整數)的檔案,其中每個數都
小於等於
n,且n=10^7。
輸出:得到按從小到大公升序排列的包含所有輸入的整數的列表。
條件:最多有大約1mb的記憶體空間可用,但磁碟空間足夠。且要求執行時間在5分鐘以下,10秒為最佳結果。
2.演算法實現
標頭檔案#include"extern.h"
#pragma once
#include#include#includeusing namespace std;
#include#define min -1 //這裡開始的時候出現了乙個bug,如果定義的min大於等於待排序的數,則會是演算法出現錯誤
#define max 10000000 //最大值,附加在歸併檔案結尾
typedef int* losertree;
typedef int* external;
class externsort
//input_file:輸入檔名
//out_file:輸出檔名
//count:每次在記憶體中排序的整數個數
externsort(const char* input_file, const char* out_file, int count)
virtual ~externsort()
private:
int m_count;//陣列長度
char* m_in_file; //輸入檔案的路徑
char* m_out_file; //輸出檔案的路徑
int k; //歸併數,此數必須要內排序之後才能得到,所以下面的ls和b都只能定義為指標
losertree ls;//定義成為指標,之後動態生成陣列
external b;//定義成為指標,在成員函式中可以把它當成陣列使用
protected:
int read_data(file* f, int a, int n)
void write_data(file* f, int a, int n)
char* temp_filename(int index)
static int cmp_int(const void *a, const void* b)
int memory_sort()
delete array;
fclose(fin);
return file_count;
} void adjust(int s) //此處可通過畫出敗者樹的圖來理解參考部落格
t = t / 2;
} ls[0] = s; //ls[0]存放調整後最大值的位置
} void createlosertree()
void k_merge()
for (i = 0; i < k; ++i)//初始讀取
}createlosertree();
int q;
while (b[ls[0]] != max)
//output(ls[0]);
fprintf(fout, "%d ", b[ls[0]]);
for (i = 0; i < k; ++k) //清理工作
delete farray;
fclose(fout);
}};
原始檔
#include"extern.h"
const unsigned int count1 = 10000000;
const unsigned int number_to_sort = 100000; //在記憶體中一次排序的數量
const char* unsort_file = "unsort_data.txt"; //原始未排序的檔名
const char* sort_file = "sort_data.txt";//已排序的檔名
void init_data(unsigned int num); //隨機生成資料檔案
int main()
void init_data(unsigned int num)
Python實現基於敗者樹的K路歸併排序
import random import os,sys 隨機生成不大於max的長度位n的列表 def genlist n,max result for i in range n print result return result 從給定的列表中獲取k個有序列表分組 def splitsortedl...
歸併排序的C 實現
歸併排序是一種穩定排序演算法,它的時間複雜度與快排一樣都是o n logn 歸併排序的基本思路是 對於兩個已經排好序的陣列,將它們合併成乙個有序陣列是比較容易的 所以可以利用遞迴地思路,將乙個陣列分成兩個子陣列,再對這兩個子陣列進行分解,直到每個子陣列都是有序的 最極限的情況就是每個子陣列都只有乙個...
歸併排序的 C 實現
首先貼 void mergesort vector nums,int left,int right while i mid nums k temp i while j right nums k temp j 深感 c 是門蛋疼的語言,vector 也好,陣列也好,操作起來就是沒有 python 的 ...