归并排序最核心的思想就是分而治之。基本流程就是将问题先进行分解,分解到最小单位,然后解决子问题(这里可以采用递归的方法也可以采用非递归的方法)最后合并问题解
我们以数组{2,3,6,7,4,1,5,8}为例;
第一步:分解子问题,解决子问题
第三步:合并子问题
代码实现:本节先使用递归方法
第一步:分解子问题
MergeSort(source, temp, startIndex, midIndex);
MergeSort(source, temp, midIndex + 1, endIndex);
左边的分解是从最初的位置到中间位置,右边的分解是从中间位置加1到最后一个位置
第二步解决子问题
void Merge(int* source, int *temp, int startIndex, int midIndex, int endIndex) {
assert(source != NULL && temp != NULL);
int i = startIndex, j = midIndex + 1, k = startIndex;
while (i != midIndex + 1 && j != endIndex + 1) {
if (source[i] > source[j])
temp[k++] = source[j++];
else
temp[k++] = source[i++];
}
while (i != midIndex + 1)
temp[k++] = source[i++];
while (j != endIndex + 1)
temp[k++] = source[j++];
for (i = startIndex; i <= endIndex; i++)
source[i] = temp[i];
}
首先需要一个暂时存储排序好的子数组,最后将这个暂时存储的数组里面的元素一一赋值给原来的数组。
首先第一个while循环是用来遍历左数组和右边数组的最小值,将最小的数保存在数组中,依次下去,当while循环结束两边数组可能没有遍历完所以我们后面的两个while循环时用来将剩余未遍历完的数组(这里是异或关系即要么是左数组未遍历完要么就是右数组未遍历完)。最后将排好序的临时数组赋值给原先的数组
第三步 合并子问题
最后整体代码
void Merge(int* source, int *temp, int startIndex, int midIndex, int endIndex) {
assert(source != NULL && temp != NULL);
int i = startIndex, j = midIndex + 1, k = startIndex;
while (i != midIndex + 1 && j != endIndex + 1) {
if (source[i] > source[j])
temp[k++] = source[j++];
else
temp[k++] = source[i++];
}
while (i != midIndex + 1)
temp[k++] = source[i++];
while (j != endIndex + 1)
temp[k++] = source[j++];
for (i = startIndex; i <= endIndex; i++)
source[i] = temp[i];
}
void MergeSort(int *source, int *temp, int startIndex, int endIndex) {
if (source == NULL) {
return;
}
int midIndex;
if (startIndex < endIndex) {
midIndex = startIndex + (endIndex - startIndex) / 2;
MergeSort(source, temp, startIndex, midIndex);
MergeSort(source, temp, midIndex + 1, endIndex);
Merge(source, temp, startIndex, midIndex, endIndex);
}
}
int main(int argc, char* argv[]) {
int a[8] = {2,3,6,7,4,1,5,8};
int i, b[8];
MergeSort(a, b, 0, 7);
for (i = 0; i < 8; i++)
printf("%d ", a[i]);
printf("\n");
return 0;
}
代码运行结果如下
自从上次更新完c++的博客后,小白就去准备学校的期末考试,现在已经考完了,小白接下来的日子会频繁更新自己在C++和mysql以及算法上面的学习过程。