首页 > 其他分享 >快速排序

快速排序

时间:2022-12-27 22:00:50浏览次数:39  
标签:分界点 边界 元素 数组 排序 快速 指针

算法学习的第一天


 

算法学习之快速排序

快速排序采用分治的思想。

它的基本思想是:选择一个分界点,通过一趟排序将要排序的数据分割成独立的两部分;其中一部分的所有数据都比另外一部分的所有数据都要小。然后,再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

一般快速排序的使用有以下几个步骤:

①确定分界点。一般分界点的确定方式为:左边界 l; 右边界 r ; 中间值。 常采取左边界确定分界点的方法;

②调整区间。将整个数组调整成为两个区间。第一个区间中所包含的元素都小于等于分界点;另一个区间中所包含的元素都大于等于分界点;退出之后,该基准就处于数列的中间位置。

③递归处理左右两个区间,使其成为一个有序序列。

在调整区间这一步中,通用的方法为

①开两个数组a[ ],b[ ];

②原数组中的元素进行遍历。元素小于等于分界点的,就存在a[ ]数组中;元素大于分界点的,就存在b[ ] 数组中;

③遍历结束,分别对a[ ],b[ ]数组排序,排序结束后进行合并。

 

笔者学习的快速排序则是引用两个指针 i ,j 处理步骤②。

函数代码

void quick_sort(int q[] , int l ,int r) //定义一个函数quick_sort 其中q[]为原数组,l为q[]的左边界,r为q[]的边界
{    if(l >= r) return ; //如果左边界大于等于右边界,跳出函数
    
    int x = q[l],i = l - 1 , j = r +1; //定义x为分界点(左边界),定义两个指针i,j i指针为左指针,j指针为右指针
    while(i < j) //当i的值小于j的值时
    {
        do i++ ; while(q[i] < x); //如果当前i所代表的元素小于分界点,那么i则向右前进一位,否则停止
        do j-- ; while(q[j] > x);//如果当前j所代表的元素大于分界点,那么j则向左前进一位,否则停止
        if(i < j) swap(q[i],q[j]); //当i,j最终停下时,i代表的元素小于j代表的元素,那么i,j两个元素交换位置
    } //最终,分界点左边的元素都小于分界点;分界点右边的元素都大于分界点。
    
    quick_sort(q ,l ,j); //第一次排序的是分界点左边的元素
    quick_sort(q , j + 1 , r);//第二次排序的是分界点右边的元素
}

 

快速排序是不稳定的算法,它不满足稳定算法的定义。
算法稳定性 -- 假设在数列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;并且排序之后,a[i]仍然在a[j]前面。则这个排序算法是稳定的!

 

快速排序平均时间复杂度O(N*lgN)  

 

标签:分界点,边界,元素,数组,排序,快速,指针
From: https://www.cnblogs.com/litershry/p/17009103.html

相关文章

  • VSCode使用技巧快速生成HTML模板
    本章目录:-前言简述-自定义HTML模板前言简述描述,我们在使用vscode时,新建的html文件是什么内容都没有的空文件,每次新建之后我们都要写那一坨一模一样的固定结构的标签。那有......
  • 快速入门音视频技术的方法,有吗?
    最近有读者留言,说“想转行音视频开发,怎么做”,正巧,前几天我还在某乎上,看到有人在问音视频的学习资料,还是个大一的学生。 想说一句:真有眼光。 如今这个时代,想赚钱,一个共识是......
  • Redis的高并发和快速原因
     1.Redis是基于内存的,内存的读写速度非常快;2.Redis是单线程的,省去了很多上下文切换线程的时间;3.Redis使用多路复用技术,可以处理并发的连接。非阻塞IO内部实现采用epol......
  • 快速幂 矩阵快速幂题解
    目录快速幂矩阵快速幂练习题题解12.28HDU1061HDU1575HDU2035HDU5015HDU6198快速幂矩阵快速幂练习题题解12.28HDU1061题意:给定T组数据,接下来T行有T个数,求N的N次......
  • 冒泡排序
      #include<iostream>usingnamespacestd;intmain(){ intarray[9]={2,1,4,6,5,9,7,3,8}; cout<<"排序前数组为"<<endl; for(inti=0;i<9;i++) { ......
  • 安装算量风管上阀件的规格为该设备所在位置的管道规格怎样快速区分?
    答:通过单类设备的识别软件将同种类型的设备一起计算了,但有可能设备所在管道的规格不一样,那么不同规格的设备是需要区分的,设备计算完成后按管线拆分设备即可。操作步骤如下:定......
  • JavaWeb项目实战(3)软件快速下载
    前两篇文章里提到的所有文件均可在这里下载:​​https://www.lmonkey.com/tools/java​​......
  • 快速排序
    思路:取一个对比值,然后将他从原数组中取出,跟数组中剩下的值进行对比,需要创建两个数组,一个记录比值小的,一个记录比值大的functionquickSort(arr){if(arr.length<......
  • 【Golang 快速入门】项目实战:即时通信系统
    即时通信系统-服务端项目架构图: 版本迭代:版本一:构建基础Server版本二:用户上线功能版本三:用户消息广播机制版本四:用户业务层封装版本五:在线用户查询版本六:修改用户名......
  • Windows操作系统TIME_WAIT状态的TCP连接快速回收时间(性能测试时端口不够用)
    https://www.bilibili.com/read/cv16258140大规模Windows环境下,采用Nginx反向代理服务后,操作系统会产生较多TIME_WAIT的TCP(TransmissionControlProtocol)连接,操作系统......