###归并排序的深入理解与逆序数的计算
int temp[N];//临时数组储存数据
void merge_sort(int a[] , int l , int r)
{
if (l >= r) return ; //递归的出口
int mid = l + r >> 1;
//分为一个单元
merge_sort(a,l,mid);
merge_sort(a,mid + 1,r);
int k = 0 , i = l , j = mid + 1;
//进行合并
while (i <= mid && j <= r)
{
if (a[i] <= a[j]) temp[k ++] = a[i ++];
else temp[k ++] = a[j ++];
}
while (i <= mid) temp[k ++] = a[i ++];
while (j <= r) temp[k ++] = a[j ++];
//恢复排好序的数组
for (int i = l ,j = 0 ; i <= r ; i ++ , j ++) a[i] = temp[j];
}
要理解递归排序的过程:
在此模板中递归排序中 首先第一步为将数据分为俩部分,左边一半,右边一半。再用递归分别对俩边分组,直到将最短数据分为一个单位返回到上一层的递归 ,右半部分同样的递归。到剩俩个数据时临时储存进行排序,排序后再进行上一层的排序,归并排序的递归过程是一个树形结构。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e6dD4GV2-1617775372708)(C:\Users\左泽平\Desktop\算法\算法思路截图\归并排序的过程.jpg)]
归并排序还可以用来求解逆序数:
//首先呢 : 归并排序从最小从左往右进行合并 ,
while (i <= mid && j <= r)
{
if (a[i] <= a[j]) temp[k ++] = a[i ++];
else temp[k ++] = a[j ++];
}
进行此处合并时,左右俩边已经有了顺序, 若 (a[i] > a[j]) 那么 a[j] 小于 a[i]这边序列大于a[i]的所有数 , 所以说逆序数是 mid - i + 1;
i]的所有数 , 所以说逆序数是 mid - i + 1;