多路歸併對1000 萬無序數排序(外排序)

2021-07-03 13:21:03 字數 1704 閱讀 6746

演算法思路:首先根據記憶體要求將排序檔案分成k份,然後迴圈讀這k個檔案分別進行排序。  然後用同時開啟這k個檔案,讀出每個檔案的第乙個數字,找出其中最小的數字寫到result.txt檔案中並且讓這個具有最小數字的檔案讀取下乙個數字,繼續找k個檔案中的最小數字,直到k個檔案都被讀取完為止,result 中就是最後排完序的結果。

多路歸併,時間複雜度為o(k*n/k*logn/k )這種方法由於頻繁進行io操作,效率相對位圖方法低一些。

#include #include #include #include using namespace std;  

int sort_num = 10000000;

int memory_size = 250000;

//每次只對250k個小資料量進行排序

int read_data(file *fp, int *space)

void write_data(file *fp, int *space, int num)

} // check the file pointer whether valid or not.

void check_fp(file *fp)

} int compare(const void *first_num, const void *second_num)

string new_file_name(int n)

int memory_sort()

fclose(fp_in_file);

// return the number of auxiliary files.

return counter;

}

void merge_sort(int file_num)

int *first_data = new int[file_num];

//new出個大小為0.1億/250k陣列,由指標first_data指示陣列首位址

bool *finish = new bool[file_num];

memset(finish, false, sizeof(bool) * file_num);

// read the first number of every auxiliary file.

for (i = 0; i < file_num; i++)

fscanf(fp_array[i], "%d ", &first_data[i]);

while (true)

} // write the orderly result to file.

fprintf(fp_out_file, "%d ", min_data);

if (fscanf(fp_array[index], "%d ", &first_data[index]) == eof)

finish[index] = true;

} fclose(fp_out_file);

delete finish;

delete first_data;

for (i = 0; i < file_num; i++)

fclose(fp_array[i]);

delete fp_array;

}

int main()

無序陣列的歸併排序與合併多個有序陣列

1.什麼是歸併排序?歸併排序先把大的陣列的合併問題拆分成多個小的區間,然後兩兩進行合併。核心思想是遞迴 歸併 遞迴 把大區間拆分成無數個小區間 歸併 把兩個小區間合併成乙個大區間 解題思路 遞迴 兩個有序列表的合併 1.案例1 對無序的陣列進行歸併排序 如下 public static void m...

對無序陣列排序,並將某個元素插入到陣列對應位置

首先是對無序陣列的排序實現 假設陣列oldarray中儲存的是model,並且以model的number排序,利用系統的方法 nsarray orderarray oldarray sortedarrayusingcomparator nscomparisonresult custommodel n...

從歸併排序到數列的逆序數對

首先來看看原題 微軟2010年筆試題 在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序數對。乙個排列中逆序的總數就稱為這個排列的逆序數。如中,2和1,4和3,4和1,3和1是逆序數對,因此整個陣列的逆序數對個數為4,現在給定一陣列,要求統計出該陣列的逆...