归并排序
归并排序
时间复杂度\(\mathrm{O}(nlogn)\)
排序的主要思想如图所示

先将待排序的内容拆分直到无法拆分为止,然后再将拆分的内容逐层排好顺序归并到一起
这里使用的归并思想如图所示

逐个比较两条有序片段的内容,取出小的哪一个
代码的主体结构如图所示

B、C两个区域的内容相比较后放入A中
//首先这里都是左闭右开的结构
void merge(int *a, int lo, int mi, int hi) {
int *A = a + lo;//A指向数据域的开头
int lb = mi - lo;
int *B = new int[lb];//给B分配一块内存临时存放数据
for (int i = 0; i < lb; i++)
B[i] = A[i];//复制数据
int lc = hi - mi;
int *C = a + mi;//C指向他所管的数据域的开头
//因为lb和lc表示B区域和c区域的大小,根据c/c++下标指示的规则,
//for的跳出规则就是j和k分别小于lb和lc
for (int i = 0, j = 0, k = 0; (j < lb || k < lc); ) {
if ((j < lb) && ((lc <= k) || (B[j] <= C[k]))) A[i++] = B[j++];
if ((k < lc) && ((lb <= j) || (C[k] < B[j]))) A[i++] = C[k++];
}
delete [] B;
return;
}
void mergesort(int *a, int lo, int hi) {
if (hi - lo < 2) return;
int mi = (lo + hi) / 2;
mergesort(a, lo, mi);
mergesort(a, mi, hi);
merge(a, lo, mi, hi);
return;
}

浙公网安备 33010602011771号