演算法思路:首先根據記憶體要求將排序檔案分成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,現在給定一陣列,要求統計出該陣列的逆...