归并排序


归并排序

1.概念

归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法,归并排序对序列的元素进行逐层折半分组,然后从最小分组开始比较排序,合并成一个大的分组,逐层进行,最终所有的元素都是有序的

2.原理

例如我们将4、5、8、7、2、6、3进行排序

首先我们需要划分区间,这一步骤我们用递归来实现。

图片

再将每一个小的序列按照从小到大的顺序进行排序存入一个新的数组当中,最后再把元素赋给原数组。

3.代码
int tmp[1000], a[1000];
void merge_sort(int a[], int l, int r)
{
    int mid = l + r >> 1;
    merge_sort(a, l, mid);
    merge_sort(a, mid + 1, r);
    int k = 0, i = l, r = mid + 1;
    while(i <= mid && j <= r)
    {
        if(a[i] <= a[j])tmp[k++] = a[i++];
        else
            tmp[k++] = a[j++];
    }
    while(i <= mid) tmp[k++] = a[i++];//这里防止某个区间有剩余元素
    while(j <= r) tmp[k++] = a[j++];
    for(i = 0, j = l; j <= r; i++, j++)//把排好序的数赋给原数组
        a[j] = tmp[i];
}

4.归并排序求逆序数

int tmp[1000], a[1000];
long long res;
long long merge_sort(int a[], int l, int r)
{
    int mid = l + r >> 1;
    res += merge_sort(a, l, mid) + merge_sort(a, mid + 1, r);
    int k = 0, i = l, r = mid + 1;
    while(i <= mid && j <= r)
    {
        if(a[i] <= a[j])tmp[k++] = a[i++];
        else
        {
            res += mid - i + 1;//a[i]的数全部大于a[j]
            tmp[k++] = a[j++];
        }
    }
    while(i <= mid) tmp[k++] = a[i++];//这里防止某个区间有剩余元素
    while(j <= r) tmp[k++] = a[j++];
    for(i = 0, j = l; j <= r; i++, j++)//把排好序的数赋给原数组
        a[j] = tmp[i];
    return res;
}
posted @ 2022-04-04 19:10  Flying_bullet  阅读(36)  评论(0)    收藏  举报