首页 > 编程语言 >快速排序——acwing算法基础课笔记

快速排序——acwing算法基础课笔记

时间:2023-11-07 11:14:17浏览次数:30  
标签:sort int quick while 基础课 区间 排序 acwing

课堂内容+个人思考,个人笔记,但是欢迎补充、批评、指正。

快速排序基于分治的思想

平均时间复杂度O(nlogn)

已知数组q[]

 步骤:

1、确定分界点(x):

   (1)首元素q[l];  (2)尾元素q[r];  (3)中值q[(l+r)/2];  (4)随机;

2、调整区间

  将区间通过x值划分为两部分(长度不一定相等),使得第一个区间所有数均小于等于x。第二个区间所有数均大于等于x。

  注:若某数等于x,在左在右均可。

3、递归处理左右两端

  左右重复步骤2。

方法(调整区间):

暴力做法:

 

优美做法:

利用两个指针i,j。

1、i从首位向右扫描,数据<x时,i继续,数据>=x时停止;

2、j从末位向左扫描,数据>x时,j继续,数据<=x时停止;

3、交换i,j的值;

4、重复1~3,直到i、j相遇(穿过)。

注:数据并没有被抽离数组,分界点仍在数据中被排序;

  若i/j仅一者停止,那么j/i会一直移动到i/j,此时左右区间满足条件。

  有很多边界问题,最好背过模版。

  写过几次就错了几次。

模板:

void quick_sort(int q[], int l, int r)
{
    if (l >= r) return;//区间无数据(1/0个)时,结束

    int i = l - 1, j = r + 1, x = q[l + r >> 1];
  /*因为循环体i、j先++、--了一次*/ while (i < j) { do i ++ ; while (q[i] < x); do j -- ; while (q[j] > x); if (i < j) swap(q[i], q[j]);//未相遇时,交换元素 } quick_sort(q, l, j), quick_sort(q, j + 1, r);//迭代左右两区间 }
//说实话,这代码真好看。

对于最后迭代的部分取i还是取j:

  取i是x不取左边界(l),取j时x不取右边界(r)。

  所以我无脑取中值。

 

 

 

 

 

标签:sort,int,quick,while,基础课,区间,排序,acwing
From: https://www.cnblogs.com/zerocloud01/p/17814547.html

相关文章

  • 排序算法
    1.插入类排序1.1直接插入排序classSolution{publicvoidinsertSort(int[]arr,intn){inttmp;for(inti=1;i<n;i++){//将待插入的关键字暂存于tmp中tmp=arr[i];intj=i-1;/......
  • js日期排序
    letdata=[{id:2,time:'2019-04-2610:53:19'},{id:4,time:'2019-04-2610:51:19'},{id:1,time:'2019-04-2611:04:32'},{id:3,time:'2019-04-2611:05:32'}]//property是你需要排序传入的key,bol为tru......
  • sql 多个字段排序问题
    ec_perform_sh_sailing_plan表,上数日期字段shangshuDate;预到日期yuji_daoda_date; 如果上数日期有值,按预到时间降序。如果上数日期没有值,按预到时间升序,上数日期没有值的排在有值的前面;SELECT*FROMec_perform_sh_sailing_planORDERbyCASEWHENshangshuDateISNUL......
  • 基础课-前端
    前端技术的实际意义前端就是软件中的图形界面页面软件通过前端界面:1.获得用户的输入数据                2.展示数据给用户前端开发需要掌握的三项技术(语言):1.HTML超文本标记语言2.CSS层叠样式表语言3.JavaScript(JS)动态脚本语言HTML基......
  • L-4: 34--在排序数组中查找元素的第一个和最后一个位置
    给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1,-1]。你必须设计并实现时间复杂度为 O(logn) 的算法解决此问题。 示例1:输入:nums=[5,7,7,8,8,10],tar......
  • 关于中断的分类和优先级(优先级由高到低排序)
    1.机器校验中断:高速程序发生了设备故障,比如电源故障,主存出错等2.访管中断:用户程序需要操作系统接入,调用操作系统服务等3.程序性中断:包括指令和数据的格式错误,程序执行中出现异常等4.外部中断:来自机器外部,包括定时器中断、外部信号中断、中断键中断等5.IO中断:由IO控制器产生,用......
  • 数据结构之排序
    一.什么是稳定排序?排序后相等元素的相对位置不发生变化二.稳定排序有哪些?2.1.不稳定排序:快速排序、希尔排序、堆排序2.2.稳定排序:冒泡排序、插入排序、归并排序、基数排序三.各大排序算法3.1.稳定算法3.1.1.冒泡排序思想:通过两两比较不断将最大的数浮出水面。一次浮出一......
  • cf1322BPresent(基数排序+双指针+拆位)
    cf1322BPresent首先拆位是显然的,对于两个数a[i],a[j],除了考虑当前位上的数,我们还要考虑是否会产生进位,我们可以利用基数排序+双指针,因为我们每次都是将低位的排好序了,所以我们可以用双指针计算进位,然后分类计算一下,当前为为1的情况即可。#include<cstdio>#include<algorithm>#......
  • java中的重排序和volatile关键字
    一、内存模型基础1、内存模型描述的是程序中各变量(线程共享变量)的访问规则,以及在实际计算机系统中将变量存储到内存和从内存读取出变量这样的低层细节。2、Jvm系统中存在一个主内存(MainMemory或JavaHeapMemory),Java中所有变量都储存在主存中,对于所有线程都是共享的。3、每......
  • C++使用冒泡排序算法对数组进行排序
     #include<iostream>//包含iostream库usingnamespacestd;//使用标准命名空间intmain(){//主函数intarr[]={5,3,2,8,6,7,1,4};//定义并初始化数组intn=sizeof(arr)/sizeof(arr[0]);//计算数组长度//使用冒泡排序算法对数组进......