首页 > 其他分享 >归并排序

归并排序

时间:2022-11-14 16:22:05浏览次数:43  
标签:归并 return 复杂度 mid msort 排序

基本思想:通过分块治理,现将分开的部分变得有序,再来进行合并,称为归并排序。
二路归并:通过将待排序咧分成两部分进行归并排序,称为二路归并排序。

将每个元素拆分成大小为1的分区
递归地合并相邻分区
  遍历 i=左侧首项位置 到右侧末项位置
    如果 左侧首项的值 <= 右侧首项的值
      拷贝左侧首项的值
    否则:拷贝右侧首项的值;增加逆序数
a = 待排序列

def msort(l, r):
  if l == r:
    return
  mid = (l+r)>>1
  msort(l, mid)
  most(mid+1, r)
  i, j, k = l, mid+1, 1
  while i<=mid and j<=r:
    if a[i] <= a[j]:
      b[k]=a[i]
      i++
    else:
      b[k]=a[j]
      j++
    k++
  while i<=mid: b[k++]=a[i++]
  while j<=r: b[k++]=a[j++]
  for i in range(r): a[i] = b[i]

most(0, len(a))
print(a)

稳定排序
时间复杂度\(O(nlog_2n)\)
空间复杂度\(O(n)\),因采用递归,还需占用栈空间。

逆序对问题

a = 待排序列
ans=0
def msort(l, r):
  if l == r:
    return
  mid = (l+r)>>1
  msort(l, mid)
  most(mid+1, r)
  i, j, k = l, mid+1, 1
  while i<=mid and j<=r:
    if a[i] <= a[j]:
      b[k]=a[i]
      i++
    else:
      b[k]=a[j]
      ans += mid-i+1
      j++
    k++
  while i<=mid: b[k++]=a[i++]
  while j<=r: b[k++]=a[j++]
  for i in range(r): a[i] = b[i]

most(0, len(ans))
print(a)

标签:归并,return,复杂度,mid,msort,排序
From: https://www.cnblogs.com/mumuzeze/p/16889382.html

相关文章

  • 冒泡排序
    基本思想:每次都是两两比较,比较完成之后符合条件则交换,直到把最大(最小)元素拍到最后,视为冒出。冒泡排序,是另一种意义上的插入排序,插入排序左边的有序,而冒泡排序右边的有序,所......
  • 用冒泡法给一组数据按升序排序
    #include<stdio.h>voidMaopao(intarr[],intsz){ inti=0; intflog=1; for(i=0;i<sz-1;i++) { intj=0; for(j=0;j<sz-1-i;j++) {  if(arr[j]>arr[j+1......
  • 自定义字符串排序 缀点成线 玩筹码 一周中的第几天 公交站间的距离
    791.自定义字符串排序StringBuilderans=newStringBuilder();int[]pre=newint[26];把目标字符串做成数组for(charch:s.toCharArray()){pre[ch-'a']++;}......
  • 791. 自定义字符串排序
    791.自定义字符串排序classSolution{int[]w=newint[30];publicStringcustomSortString(Stringorder,Strings){for(inti=0;i<26;i......
  • Scala 函数排序
    Scala函数排序文章目录​​Scala函数排序​​​​基于单集合单字段的排序​​​​基于元组多字段的排序​​​​基于类的排序​​​​(2)sortWith的实现方法    排序规......
  • 关于极角排序
    structpoint{doublex,y;};doublecross(doublex1,doubley1,doublex2,doubley2)//计算叉积{return(x1*y2-x2*y1);}doublecompare(pointk,point......
  • Mysql_DQL操作表_排序查询(重点)
    --查询学生信息,按照年龄升序排列;SELECT*fromstuORDERBYage;--查询学生信息,按照数学成绩降序排列;SELECT*fromstuORDERBYmathdesc;--查询学生信息,按照数......
  • 计数排序
    1,速度很快,唯一缺陷是计数长度列表和排序的最大数字相等,如果排序中的数字实在太大了,创建的列表太长了比如2的32次方importrandomdefcount_sort(li,max_count......
  • 自定义字符串排序
    题目给定两个字符串order和s。order的所有单词都是唯一的,并且以前按照一些自定义的顺序排序。对s的字符进行置换,使其与排序的 order 相匹配。更具体地说,如果......
  • 791. 自定义字符串排序
    791.自定义字符串排序给定两个字符串order和s。order的所有单词都是唯一的,并且以前按照一些自定义的顺序排序。对s的字符进行置换,使其与排序的 order 相匹配......