归并排序

归并排序

时间复杂度\(\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;
}
posted @ 2019-04-08 12:01  start-from-ling  阅读(112)  评论(0)    收藏  举报