归并排序-分治思想

归并排序的基本思想是:

  • 将待排序的元素分成大小大致的两个子集合,
  • 再分别对两个子集合调用归并排序,
  • 最终将排序好的子集合合并成要求的排序好的集合。

用一个8位的数组举例:

  • 将待排序的数组一分为二直到只剩下一个元素
3 1 7 8 6 5 4 2
3 1 7 8 6 5 4 2
3 1 7 8 6 5 4 2
3 1 7 8 6 5 4 2
  • 将子集合合并
3 1 7 8 6 5 4 2
1 3 7 8 5 6 2 4
1 3 7 8 2 4 5 6
1 2 3 4 5 6 7 8

下面是c++语言编写的归并排序的核心代码

void Merge(int *arr, int left, int middle, int right) {
    int *temp = new int [right-left+1];
    /*
    	这里动态申请了一个辅助的数组temp
    */
    int i = left;
    int j = middle + 1;
    int k = 0;
    while (i <= middle && j <= right) {
        if (arr[i] <= arr[j])
            temp[k++] = arr[i++];
        else
            temp[k++] = arr[j++];
    }
    while (i <= middle)
        temp[k++] = arr[i++];
    while (j <= right)
        temp[k++] = arr[j++];
    for (i = 0; i < k; i++)
        arr[i + left] = temp[i];
    delete[] temp;
}
void MergeSort(int *arr, int left, int right) {
    if (left < right) {
        int middle = (left + right) / 2;
        MergeSort(arr, left, middle);
        MergeSort(arr, middle + 1, right);
        Merge(arr, left, middle, right);
    }
}

如果你觉得这篇文章对你有帮助,点个赞吧~ pwp ~°

发布了6 篇原创文章 · 获赞 8 · 访问量 855

猜你喜欢

转载自blog.csdn.net/weixin_43853811/article/details/105152397