作者fredal
https://www.jianshu.com/p/28d0f65aa6a1
所有內(nèi)部排序算法的匯總表
現(xiàn)在Tb1和Tb2都包含一些連續(xù)的字符串。我們?nèi)〕雒勘P磁帶的第一個順序字符串,并將它們組合起來,并將結(jié)果寫入Ta1,Ta1是一個雙長度的順序字符串。然后,我們從每盤磁帶中取出下一個連續(xù)的字符串,將其合并并寫入Ta2。繼續(xù)此過程,直到Tb1或Tb2為空。繼續(xù)這個過程,直到我們得到一個長度為n的連續(xù)字符串
如果我們有額外的磁帶,我們可以減少對輸入數(shù)據(jù)進(jìn)行排序的次數(shù),我們可以通過將基本的(2路)合并擴(kuò)展到(k路)合并來做到這一點。這叫做多路合并
上面討論的k- way合并方案需要使用2k磁帶。事實上,我們只需要使用k+1個磁帶就可以完成排序工作,這就是所謂的多階段合并。以三盤磁帶完成雙向合并為例:
這里序列的初始分布是個關(guān)鍵問題,其實斐波那契數(shù)是最好的。
對于序列的構(gòu)造,也可以采用排列選擇排序,采用堆的思想,有特殊的價值。
接下來,實現(xiàn)完整的外部排序
package com . fredal . structure;
import Java . io . file;
import Java . io . FileInputStream;
import Java . io . FileNotFoundException;
import Java . io . FileOutputStream;
import Java . io . IOexception;
import Java . util . ArrayList;
import Java . util . arrays;
import Java . util . iterator;
import Java . util . random;
publicclassExternalSort{
publicationstatintbuffer _ SIZE = 10;
公共文件排序(文件文件)拋出異常{
ArrayList<。文件>files = split(file);
returnprocess(文件);
}
//遞歸方法來合并列表,直到我們剩下一個
//單個合并列表
私有文件進(jìn)程(數(shù)組列表& lt文件>list)throwsIOException {
if(list.size() == 1) {
return list . get(0);
}
ArrayList<。文件>inter = newArrayList<。文件>();
for(迭代器& lt文件>itr = list . iterator();itr . HasNeXt();) {
file one = itr . next();
if(itr.hasNext()) {
file two = itr . next();
inter.add(合并(一、二));
} else{
returnone
}
}
return process(inter);
}
/**
*將原始文件分割成多個子文件。
*/
privateArrayList<。文件>分割(文件文件)拋出異常{
ArrayList<。文件>files = newArrayList & lt文件>();
int[]BUFFER = new int[BUFFER _ SIZE];
FileInputStream fr = NewFileInputStream(文件);
booleanfileComplete = false
while(!fileComplete) {
intindex = buffer.length
for(inti = 0;i <。緩沖區(qū)長度& amp& amp!fileCompletei++) {
buffer[I]= ReadInt(fr);
if(buffer[i] == - 1) {
fileComplete = true
index = I;
}
}
if(緩沖區(qū)[ 0]>;- 1) {
Arrays.sort(buffer,0,index);
File f = newFile( "set"+ newRandom()。nextInt());
file output stream writer = NewFileoutput stream(f);
for(intj = 0;j <。指數(shù);j++) {
writeInt(buffer[j],writer);
}
writer . close();
files . add(f);
}
}
fr . close();
returnfiles
}
/**
*將兩個已排序的文件合并為一個文件。
*
* @paramone
* @paramtwo
* @返回
* @throwsIOException
*/
私有文件合并(文件一,文件二)拋出異常{
FileInputStream fis 1 = NewFileInputStream(一);
file inputstream fis 2 = new file inputstream(兩個);
文件輸出= newFile("合并"+ newRandom()。nextInt());
file output stream OS = NewFileoutput stream(輸出);
inta = ReadInt(fis 1);
int b = ReadInt(fis 2);
booleanfinished = false
while(!完成){
if(a!=-1 & amp;& ampb!= - 1) {
if(a & lt;b) {
writeInt(a,OS);
a = ReadInt(fis 1);
} else{
writeInt(b,OS);
b = ReadInt(fis 2);
}
} else{
finished = true
}
if(a = =-1 & amp;& ampb!= - 1) {
writeInt(b,OS);
b = ReadInt(fis 2);
} else if(b = =-1 & amp;& ampa!= - 1) {
writeInt(a,OS);
a = ReadInt(fis 1);
}
}
OS . close();
returnoutput
}
privatevoidwriteInt(intvalue,合并文件輸出流)
throwsIOException {
merged . write(value);
merged . write(value & gt;>。8);
merged . write(value & gt;>。16);
merged . write(value & gt;>。24);
merged . flush();
}
private InTeradint(FileInputStream fis)throwSioException {
int buffer = fis . read();
if(緩沖== - 1) {
return-1;
}
buffer | =(fis . read()& lt;& lt8);
buffer | =(fis . read()& lt;& lt16);
buffer | =(fis . read()& lt;& lt24);
returnbuffer
}
/**
* @paramargs
* @throwsIOException
*/
public static void main(String[]args)throwSioException {
file file = New FIle(" main set ");
random random = new random(system . current timemillis());
file output stream fw = NewFileoutput stream(文件);
for(inti = 0;i <。BUFFER _ SIZE * 3;i++) {
int ger = random . Nextint();
ger = ger <。0?-ger:ger;
fw . write(ger);
fw . write(ger & gt;>。8);
fw . write(ger & gt;>。16);
fw . write(ger & gt;>。24);
}
fw . close();
ExternalSort sort = new ExternalSort();
system . out . println(" Original:");
dumpFile(排序,文件);
file f = sort . sort(file);
system . out . println(" Sorted:");
dumpFile(sort,f);
}
私有靜態(tài)無效轉(zhuǎn)儲文件(外部排序,文件f)
throwsFileNotFoundException,IOException {
FileInputStream fis = NewFileInputStream(f);
inti = sort . readint(fis);
while(i!= - 1) {
system . out . println(Integer . ToString(I));
I = sort . readint(fis);
}
}
}
長的
根據(jù)
接近
填充
1.《排序算法總結(jié) 數(shù)據(jù)結(jié)構(gòu)_排序算法總結(jié)》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識,僅代表作者本人觀點,與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。
2.《排序算法總結(jié) 數(shù)據(jù)結(jié)構(gòu)_排序算法總結(jié)》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進(jìn)行證實,對其原創(chuàng)性、真實性、完整性、及時性不作任何保證。
3.文章轉(zhuǎn)載時請保留本站內(nèi)容來源地址,http://f99ss.com/keji/781960.html