《資料結構與演算法分析——c語言描述》 第七章
這個還是挺有意思的,用很少的記憶體空間給很多的數排序,複雜度是logk(n/m)
#include #include #include#include//#include"fatal.h"
#define m 3
#define k 3
typedef int elementtype;
void insertionsort(int *a, int n)
}void swap_my(elementtype *a, elementtype *b)
elementtype median3(elementtype a, int left, int right)
#define cutoff (3)
void qsort_my(elementtype a, int left, int right)
while (a[--j] > pivot) {}
if (i < j)
swap_my(&a[i], &a[j]);
else
break;
} swap_my(&a[i], &a[right - 1]);
qsort_my(a, left, i - 1);
qsort_my(a, i + 1, right);
} else
insertionsort(a + left, right - left + 1);
}void quicksort_my(elementtype a, int n)
file* file[2 * k];//檔案指標陣列
char name[200];//生成的名字
int runlen;//順序串長度
void write(int *a, int n, file *out)
}char* filename(char *buf, int part, int i)
void open(int part, char* type)
} else }}
void close(int part)
int isallend(int readpart)
int isallbiggerthanrunlen(int * cursor)
return 1;
}typedef std::pairpair_int;
auto cmp = (const pair_int& left, const pair_int& right) ;//lambda表示式,算是一種比較精簡的函式吧
int randint(int i, int j)
void getrandomint(int *a, int n)
for (int i = 1; i < n; i++)
}#define n 222
void writerandinttofile()
int main()
quicksort_my(max_memory, readnum);
//交替寫到tb1或寫到tb2……
write(max_memory, readnum, file[k + writenum]);
writenum = (writenum + 1) % k;
} fclose(ta1);
close(1);
//k路排序
runlen = m;
int readpart = 1;//0表示ta1,ta2,1表示tb1,tb2
while (runlen < n)
else
writenum = 0;//寫到哪,一半中的 第乙個磁碟還是第二個磁碟
while (!isallend(readpart)) );
isinsertnew = 1;}}
}if (isinsertnew == 0 && h.empty())//這裡可是細節,這個最後只剩下空格沒有數字的話也不算檔案結尾,feof返回0
break;
pair_int p = h.top();
h.pop();
fprintf(file[writepart*k + writenum], "%d ", p.first);
cursor[p.second]++;
ishasnumnowrite[p.second] = 0;
}writenum = (writenum + 1) % k;
} close(0);
close(1);
runlen *= k;
readpart = (readpart == 0) ? 1 : 0;
}}
關於多路歸併排序 外部排序
比如檔案內有1億資料排序。程式設計珠璣第乙個case是有關乙個技巧性解決外部排序問題的。問題很巧妙的解決了,但一開始提到的利用歸併排序進行外部排序的演算法仍值得仔細 一下,畢竟本科時學的不是很深入。先來看內部排序中最簡單的2路歸併排序演算法。演算法核心操作是將一維陣列中前後相鄰的兩個有序序列歸併為乙...
敗者樹與外部多路歸併排序
在處理大資料量的排序時,由於資料無法全部載入到記憶體,內部排序無法對整個資料集進行排序,需要到外部排序。外部排序有一些特點,跟記憶體容量和讀寫檔案有關 1.讀寫檔案,需要考慮 io 時間 2.從無序到逐步有序的過程中,需要多個中間檔案外部排序有多種,常見的歸併排序的如下 輸入為大檔案 f 排序過程分...
多路歸併排序
我們有如下乙個問題 對於若干個長度相同的序列,將其合併成乙個有序的序列。暴力的方法顯然是不可取的,這裡可以利用優先佇列來處理這個問題。首先從簡單的開始,對於2路歸併排序,設兩個序列為,將,排序,有 a1 a2 a3 an b1 b2 b3 bn 建立乙個優先佇列,佇列中首先存入元素 a1,0 b1,...