首页 > 其他分享 >归并排序与逆序对个数计算

归并排序与逆序对个数计算

时间:2024-07-17 09:55:32浏览次数:21  
标签:sort 归并 int mid merge 排序 逆序

归并排序

归并排序概念介绍:

cpp实现

利用归并排序计算逆序对的个数

cpp实现

归并排序是一种稳定的,时间复杂度nlog(n)的算法,其速度仅次于快排

概念介绍:

稳定:两个相同的数在排序时相对位置不会改变,例如1554排成1455,两个5的前后位置不发生变化,

归并操作:把两个顺序序列合并成一个顺序序列例如:

a={1,3,5,7}

b={2,4,6,8}

每个数组一个指针指向各自数组最前面的一个数,进行比较,小的放入temp数组,并将其往后移

ap=0,bp=0;

*ap=1, *bp=2;

第一次比较后,ap=1,bp=0

*ap=3 , *bp=2;以此类推

归并排序的本质是用分治,分:将数组分开;治:用归并法从一个元素的数组开始归并。举例如下:

原序列:1 4 6 2 3 7 1

第一次操作:{1 4}{2 6}{3 7}{1}比较三次

二:{1 2 4 6}{1 3 7}比较四次

三:{1 1 2 3 4 6 7} 比较六次,结束。

cpp实现

void merge_sort(int q[], int l, int r)
{
    if (l >= r)return;
    int mid = (l + r )/ 2;
    merge_sort(q, l, mid);
    merge_sort(q, mid + 1, r);
    int k = 0, i = l, j = mid + 1;//从l到r
    while (i <= mid && j <= r)
    {
        if (q[i] <= q[j])temp[k++] = q[i++];
        else temp[k++] = q[j++];
    }
    while (i <= mid)//怕两个序列有没跑完的
    {
        temp[k++] = q[i++];
    }
    while (j <= r)
    {
        temp[k++] = q[j++];
    }
    for (i = 0, j = l;j <= r; i++, j++)
    {
        q[j] = temp[i];
    }
}

利用归并排序计算逆序对的个数

首先先给出逆序对的定义:有i<j,q[i]>q[j]

再看看归并排序的过程,我们很容易可以看出来,若有两个有序序列

asdfgh

zxcvbn

在归并操作中,将asd放入trmp中,意味着asd都小于z,而当第四个我选择z时,说明fgh都大于z,此时便有三个逆序对。

即在q[i]>q[j]时加上mid-i+1

cpp实现

*acwing788*

#include <iostream>
using namespace std;
int temp[1000000];
int q[1000000];
long long sum = 0;
void merge_sort(int q[], int l, int r)
{
    if (l >= r)return;
    int mid = (l + r )/ 2;
    merge_sort(q, l, mid);
    merge_sort(q, mid + 1, r);
    int k = 0, i = l, j = mid + 1;//从l到r
    while (i <= mid && j <= r)
    {
        if (q[i] <= q[j])temp[k++] = q[i++];
        else temp[k++] = q[j++], sum += mid - i + 1;
    }
    while (i <= mid)//怕两个序列有没跑完的
    {
        temp[k++] = q[i++];
    }
    while (j <= r)
    {
        temp[k++] = q[j++];
    }
    for (i = 0, j = l;j <= r; i++, j++)
    {
        q[j] = temp[i];
    }
}
int main()
{
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> q[i];
    }
    merge_sort(q, 0, n - 1);
    /*for (int i = 0; i < n; i++)
    {
        cout << q[i] << " ";
    }*/
    cout << sum << endl;
}
​

标签:sort,归并,int,mid,merge,排序,逆序
From: https://blog.csdn.net/2301_76462783/article/details/140486357

相关文章

  • 归并排序--C++
        归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采“分而自治”用的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。​图片来源于网络核心代码:voidabc(intx[],intq,intp){if(q>=p)r......
  • C# Winform PropertyGrid中文排序
    在WindowsForms中,PropertyGrid控件默认按照属性名称的字典顺序(通常是ASCII码顺序)来排序显示属性。这在处理中文字符时可能会导致不自然的排序,因为中文字符的编码顺序与中文的实际字典序不同。为了在PropertyGrid中实现中文属性的自然排序,你可以通过以下方式之一来实现:采用制......
  • 为什么JAVA库不用随机pivot方式的快速排序?
    在Java库中,不使用随机pivot方式的快速排序的原因主要有以下几点:性能问题:虽然随机pivot方式可以平均情况下提高快速排序的效率,但其在最坏情况下的表现并不理想。如果每次分区都产生极端不平衡的子数组(例如一个空数组和一个包含所有元素的数组),则会导致递归调用次数暴增,从而导致......
  • 逆序打印c++
    逆序打印c++第一次写文章请大佬多多指教说明输入n个数,要求程序按输入时的逆序把这n个数打印出来,已知整数不超过100个。也就是说,按输入相反顺序打印这n个数。输入格式两行,第一行,一个整数N;第2-N+1行,N个整数。输出格式一行,按相反顺序输出这N个数,中间用空格隔开。样例......
  • 排序算法
    排序算法sort.h#pragmaonce#include<iostream>#include<vector>usingnamespacestd;voidBubbleSortPositive(std::vector<int>&nums);voidinsertSortPositive(vector<int>&array);voidSelectionSort(vector<int>&......
  • 字符串反转、句子逆序 题目
    题目HJ12字符串反转描述输入描述:输出描述:示例:分析:代码:大佬代码:HJ13句子逆序描述输入描述:输出描述:示例:分析:代码:大佬代码:HJ12字符串反转描述接受一个只包含小写字母的字符串,然后输出该字符串反转后的字符串。(字符串长度不超过1000)输入描述:输入一行,为一个......
  • C语言数据结构初阶排序(上篇)
    排序的概念排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍......
  • 排序
    排序稳定排序:相等的数字位置不变非稳定排序:相等的数位置变换内排序:一次性装进内存外排序:先装到外存,再分步装到内存插入排序voidinsertSort(int*arr,intlen){ inti,j,tmp; if(len==1) return;for(i=1;i<len;i++)//从arr[1]到arr[len-......
  • 快速排序模板及其理解
    快速排序在面试中经常用于考察面试者的代码能力,以下是我个人对如何手撕快排的一些理解:原理:快速排序的解决分为两个部分,分区(partition)和递归(recurse)。分区是主要进行排序的功能,递归用于控制分区的次数。分区的思想是:选定一个数,将所有小于这个数的数组元素都放在它的左侧,同理......
  • 解决equal to 运算中 "Chinese_PRC_CI_AS" 和 "Chinese_PRC_CS_AS" 之间的排序规则冲
    背景:在语句执行过程中碰到equalto运算中"Chinese_PRC_CI_AS"和"Chinese_PRC_CS_AS"之间的排序规则冲突的报错时,可以用COLLATE定义和控制字符数据排序规则。在SQLServer中,COLLATE是用于定义和控制字符数据排序规则(collation)的关键字。排序规则影响字符串比较和排序的行......