首页 > 其他分享 >快速排序and归并排序

快速排序and归并排序

时间:2023-01-19 13:11:42浏览次数:39  
标签:sort 归并 int mid 排序 快速 指针

1.快速排序

快速排序的思想分治
  • 确定轴值(分界点),可以是q[l]q[l+r>>1](建议用这个)、q[r]
  • 根据轴值划分
  • 递归左右子划分

快排结束即已经是合并完的情况,所以已经完成子问题合并

代码分析
//快速排序函数
void quick_sort(int a[], int l, int r)//待排序列,左端点,右端点
{
    //序列中只有一个数或者没有数结束
    if (l >= r) return;
	
    //i j双指针来划分,pivot轴值
    int i = l - 1, j = r + 1, pivot = a[(l + r) >> 1];

    //双指针交换思想
    while (i < j)
    {
        do i++; while (a[i] < pivot);
        do j--; while (a[j] > pivot);
        if (i < j) swap(a[i], a[j]);
    }
	
    //递归左右子序列
    quick_sort(a, l, j);
    quick_sort(a, j + 1, r);
}
思想
  • 双指针划分

    左右两端设置两个指针,两指针向中间移动,左指针找到一个不属于左区间的数,右指针找到一个不属于右区间的一个数,将两者交换,直到两指针相遇循环结束就完成了划分

  • 递归时的子区间

    当分为[l,j][j + 1,r]时,轴值可以取q[l]q[(l + r) >> 1]

    当分为[l,i - 1][i,r]时,轴值可以取q[(l + r + 1) >> 1]

    其他递归区间和轴值选取都会有边界问题,建议记住第一个即可

2.归并排序

归并排序的思想分治
  • 确定分界点mid=l+r>>1
  • 递归排序左右区间
  • 归并
代码分析
int q[N], tmp[N];//需要中间数组辅助归并的过程

void merge_sort(int q[], int l, int r)//待排序列,左端点,右端点
{
    //序列中只有一个数或者没有退出递归
    if (l >= r) return;

    //分界点为中点,mid为下标
    int mid = l + r >> 1;

    //递归左右区间
    merge_sort(q, l, mid), merge_sort(q, mid + 1, r);

    //归并
    int k = 0, i = l, j = mid + 1;//k下标,i j双指针
    while (i <= mid && j <= r)
        if (q[i] <= q[j]) tmp[k++] = q[i++];
        else tmp[k++] = q[j++];
    while (i <= mid) tmp[k++] = q[i++];//归并剩下的数
    while (j <= r) tmp[k++] = q[j++];//归并剩下的数

    //注意i从左端点开始
    for (int i = l, j = 0; i <= r; i++, j++) q[i] = tmp[j];//复制回q数组
}
思想
  • 双指针

    不同于快速排序的双指针,归并运用同向双指针,快排运用双向双指针

标签:sort,归并,int,mid,排序,快速,指针
From: https://www.cnblogs.com/mpmp/p/17061334.html

相关文章

  • Kafka快速入门(命令行操作)
    Kafka命令行操作Kafka基础架构主题命令行操作1)查看操作主题命令参数bin/kafka-topics.sh-参数-描述–bootstrap-server<String:servertoconnectto>连接的KafkaBroker......
  • Kafka快速入门(生产者)同步异步发送、分区、消息精确一次发送、幂等性、事务
    Kafka生产者1.生产者消息发送流程1.1发送原理在消息发送的过程中,涉及到了两个线程——main线程和Sender线程。在main线程中创建了一个双端队列RecordAccumulator。......
  • Kafka快速入门(安装集群)
    安装部署1.集群规划hadoop102hadoop103hadoop104zkzkzkkafkakafkakafka2.集群部署0)官方下载地址:​​官网​​1)解压安装包tar-zxvfkafka_2.12-3.0.0.tgz-C/opt/module......
  • HBase 快速入门(安装和命令操作)
    1HBase安装部署1.1Zookeeper正常部署首先保证Zookeeper集群的正常部署,并启动。bin/zkServer.shstartbin/zkServer.shstartbin/zkServer.shstart1.2Hadoop正常部......
  • 常见排序算法之快速排序
    文章目录​​1、概述​​​​2、代码实现​​​​3、测试案例​​1、概述快速排序(Quicksort)是对冒泡排序的一种改进。快速排序由C.A.R.Hoare在1960年提出。它的基本思想......
  • 常见排序算法之基数排序
    文章目录​​1、概述​​​​2、测试代码​​​​3、测试小案例​​1、概述基数排序(radixsort)属于“分配式排序”(distributionsort),又称“桶子法”(bucketsort)或binsort,顾......
  • 常见排序算法之归并排序
    文章目录​​1、概述​​​​2、测试代码​​​​3、小案例​​1、概述归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(DivideandConquer)......
  • 常见排序算法之希尔排序
    文章目录​​1、概述​​​​2、希尔排序之交换法​​​​3、希尔排序之移动法​​​​4、测试案例​​1、概述由于简单的插入排序每次数据量变多的时候,数据需要移动且交换......
  • 常见排序算法之选择排序
    文章目录​​1、概述​​​​2、代码实现​​​​3、测试代码​​1、概述选择排序(Selectionsort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出......
  • 常见排序算法之冒泡排序
    文章目录​​1、概述​​​​2、传统代码​​​​3、优化后代码​​​​4、测试案例​​1、概述冒泡排序(BubbleSort),是一种的较简单且常见的的排序算法。它重复地访问排序的......