zoukankan      html  css  js  c++  java
  • 归并排序

    1.归并排序介绍:

    归并排序遵循分治的三步法,具体的归并排序可以分为以下三部分:

    划分问题:把待排序的序列分成元素个数尽量相等的两半。

    递归求解:把两半元素分别排序。

    合并问题:把两个有序表合并成一个。

    前两部分是很好实现的,关键是两个排好序的序列,怎么合并到一起呢?这要借助一个辅助数组,每次让两个已经排好序的序列的最小元素进行比较(利用下标),选出较小的元素加入到辅助数组,下标后移。如果一个序列中数据已经全部进入辅助数组,则要将另一个序列中的数据赋值给辅助数组。

    代码实现

    void merge_sort(int *a,int start,int end,int *temp)

    {

      int mid = start+(end-start)/2;

      int i=start,j=mid,k=start;

      merge_sort(a,start,mid,temp);

      merge_sort(a,mid,end,temp);

      while(i<mid || j<end)

      {

        if(q >= y || (p < m && a[i]<=a[j]))

        {

          temp[k++] = a[i++];

        }

        else

        {

          temp[k++] = a[j++]

        }

      }

      for(i = start; i < end; i++)

      {

        a[i] = temp[i];

      }

    }

    非常精炼的代码,这个大牛“刘汝佳”写的,以前写的总是很累赘。小小的膜拜一下。

    2.归并排序实现求逆序对:

    给以序列a1,a2,a3,…,an,求有多少个有序对(i,j),使得i<j,ai>aj。用分治方法和归并排序类似,不同的是要求出右边的每个j,左边有多少个数比aj大,具体实现看代码!(仔细想想哦!)

    int merge_sort(int *a,int start,int end,int *temp)

    {

      int mid = start+(end-start)/2;

      int i=start,j=mid,k=start;

      int count=0;

      int t1 =merge_sort(a,start,mid,temp);

      int t2 =merge_sort(a,mid,end,temp);

      while(i<mid || j<end)

      {

        if(q >= y || (p < m && a[i]<=a[j]))

        {

          temp[k++] = a[i++];

        }

        else

        {

          temp[k++] = a[j++];count+=mid-i;

        }

      }

      count = count + t1 + t2;

      return count;

    }

  • 相关阅读:
    树莓派基于scratch2控制GPIO
    一次修复linux的efi引导的集中方法总结记录
    linux(deepin) 下隐藏firefox标题栏
    log4j 1.2 配置和使用简述
    在非gnome系桌面环境下运行deepin-wine tim的错误解决
    manjaro AwesomeWM 上使用双显示器
    linux 关闭主板上的蜂鸣器声音
    anki的使用以及anki server的配置
    阅读《人类简史》-- 1.认知革命
    java生成zip包兼容Linux
  • 原文地址:https://www.cnblogs.com/hoobey/p/5247464.html
Copyright © 2011-2022 走看看