归并排序

经典排序算法-归并排序

  • 一些基础的算法需要亲手实践。
  • 归并算法使用了分治的思想。在算法中很好的使用了递归的处理技巧。
// 用该题练习一下归并排序算法
void Merge(int *arr, int left, int mid, int right, int *tmp)
{
    // [left, mid][mid + 1, right]两个区间段有序,需要合并
    int i = left;
    int j = mid + 1;
    int cnt = 0;
    while (i <= mid && j <= right) {
        if (arr[i] < arr[j]) {
            tmp[cnt++] = arr[i++];
        } else {
            tmp[cnt++] = arr[j++];
        }
    }
    while (i <= mid) {
        tmp[cnt++] = arr[i++];
    }
    while (j <= right) {
        tmp[cnt++] = arr[j++];
    }
    // 将tmp中保存的有序序列,拷贝到arr中,使得arr在[left, right]区间上有序
    int k = 0;
    while (k < cnt) {
        arr[left + k] = tmp[k];
        k++;
    }
}

void MySort(int *arr, int left, int right, int *tmp)
{
    if (left < right) {
        int mid = left + (right - left) / 2;
        MySort(arr, left, mid, tmp);
        MySort(arr, mid + 1, right, tmp);
        // 经过上面的两个sort之后,[left, mid][mid + 1, right]两个区间段已经是有序的了。
        // 接下来需要将两个区间重新按照有序的方式合并了。
        Merge(arr, left, mid, right, tmp);
    }
}

int Sort(int* nums, int numsSize)
{
    int *tmp = (int *)malloc(sizeof(int) * numsSize);
    memset(tmp, 0, sizeof(int) * numsSize);
    // 将nums 使用归并排序方式给排序了
    MySort(nums, 0, numsSize - 1, tmp);
    return 0;
}
posted @ 2021-10-06 18:23  匠人小魏  阅读(14)  评论(0)    收藏  举报