外排序的C 實現(歸併時利用敗者樹)

2021-07-24 07:32:10 字數 2106 閱讀 4663

參考部落格:

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 的 ...