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

快速排序

时间:2024-03-01 21:45:44浏览次数:186  
标签:右边 数字 int 左边 等于 排序 快速

1.概念

快速排序算法是对冒泡排序算法的一种改进算法,在当前所有内部排序算法中,快速排序算法被认为是最好的排序算法之一。

2.基本思想

快速排序的基本思想: 通过一趟排序将待排序的序列分割为左右两个子序列,左边的子序列中所有数据都比右边子序列中的数据小,然后对左右两个子序列继续进行排序,直到整个序列有序。

例如我们对以下的数字进行排序:
5 4 2 3 1 6
我们首先先选择一个中间数字:例如可以选择 2(2 是这串数字的物理上 的中间数字,当然也可以选择其他的数字,另外我们只是选择了这个数字的值作为中间数,并不是将它取出来)
然后把小于 2 的数字放到左边,大于 2 的数字放到右边。等于 2 的数字放到那边都可以。

我们只需要找到 最左边大于等于 2 的数,找到最右边小于等于 2 的数,然后交换它们的位置即可。(两者都可以选择等于 2 的数,是因为这样可以更好的判断结束的条件,即最左边大于等于 2 的数和最右边小于等于 2 的数重合的时候)


5 4 2 3 1 6 进行排序,中间数字选 2
5 4 2 3 1 6 最左边大于等于 2 的数是 5,最右边小于等于 2 的数是 1,交换两者
1 4 2 3 5 6 最左边大于等于 2 的数是 4,最右边小于等于 2 的数是 2,交换两者
1 2 4 3 5 6 最左边大于等于 2 的数是 2,最右边小于等于 2 的数字是 2,两者重合,结束

1 2 4 3 5 6 分析我们可以发现,这行数字被分为了两个部分,a: 1 2b: 4 3 5 6,我们可以看到左边的数字都比右边的数字小,现在我们只要对这两个部分分别进行排序,那么这行数字就排序成功了。这就是分治的思想。


a: 1 2 进行排序。中间数字选 1
1 2 结束,分为两个部分 aa: 1 ab: 2

b: 4 3 5 6 进行排序。中间数字选 3
4 3 5 6 最左边大于等于 3 的数是 4,最右边小于等于 3 的数是 3,交换两者
3 4 5 6 最左边大于等于 3 的数和最右边小于等于 3 的数字都是 3,两者重合,结束,分为两个部分 ba: 3 bb: 4 5 6

aa: 1 ab: 2 ba: 3 bb: 4 5 6
aa、ab 和 ba 都只有一个数字了,不需要再次进行排序


bb: 4 5 6 进行排序。中间数字选 5
4 5 6 最左边大于等于 5 的数和最右边小于等于 5 的数字都是 5,两者重合,结束,分为两个部分 bba: 4 5 bbb: 6

aa: 1 ab: 2 ba: 3 bba: 4 5 bbb: 6
bbb 只有一个数字了,不需要再次进行排序


bba: 4 5 进行排序。中间数字选 4
4 5 最左边大于等于 4 的数和最右边小于等于 4 的数字是 4,两者重合,结束,分为两个部分 bbaa: 4 bbab: 5

aa: 1 ab: 2 ba: 3 bbaa: 4 bbab: 5 bbb: 6
全部排序成功,最后结果是:1 2 3 4 5 6,排序成功。

3.代码实现

#include <iostream>  
#include <algorithm>
using namespace std; 
const int N = 100010;
int q[N];  
  
void quick_sort(int* arr, int l, int r) {  
    if (l >= r) return; //递归结束条件,即只有一个数字了  
  
    int i = l - 1, j = r + 1, x = arr[(l + r) >> 1]; //-1和+1是为了确保do...while循环顺利进行,x取中间值最好  
    while (i < j) {  
        do i ++ ; while (arr[i] < x); //找到左边第一个大于等于x的值(从左往右)  
        do j -- ; while (arr[j] > x); //找到右边第一个小于等于x的值(从右往左),以上为确定排序顺序的条件  
        if (i < j) swap(arr[i], arr[j]); //交换两者  
    }  
  
    quick_sort(arr, l, j); //把左边的排序  
    quick_sort(arr, j + 1, r); //把右边的排序  
}  
  
//需要注意的是,每次递归都可以确定两个部分的顺序之分,可以根据这个特点,来求解第k大的数等问题  
  
int main() {  
    int n;  
    cin >> n;  
    for (int i = 0; i < n; i ++ ) {  
        cin >> q[i];  
    }  
    quick_sort(q, 0, n - 1); //传入,下标为要排序的下标  
    for (int i = 0; i < n; i ++ ) {  
        printf("%d ", q[i]);  
    }  
    return 0;  
}

标签:右边,数字,int,左边,等于,排序,快速
From: https://www.cnblogs.com/ora-ing/p/18048015

相关文章

  • 接口写完想快速压力测试?试试Apipost一键压测功能
    背景研发同学在调试完成某些接口后需要验证一下高并发情况下的接口运行情况。这时候必须得跟测试同学协调一下,但这来来回回也有点麻烦,而实际上,这个工作量并不算太大。所以Apipost也是推出了一键压测功能来解决这个痛点场景。这篇文章给大家介绍Apipost的一键压测功能。使用方法......
  • python列表、集合、字典转换要点以及查找速度区别,如何在大规模数据中实现快速查找
    1.list与set的区别与优缺点:循环速度:list最适合做固定长度的遍历,而且有顺序。set是无序的,list转换为set会乱序,若用set给list去重,转化为list时须用原list的index排序:new_list.sort(key=old_list.index)。所以这种循环尽量用list查询速度:set>list,set查询的key都是ha......
  • 算法-2.内排序
    2.内排序2.1三种代价为Θ(n2)排序算法2.1.1插入排序※最佳时间代价Θ(n),平均、最差时间代价均为Θ(n2)1template<classElem>23voidswap(ElemA[],inta,intb){45inttemp;67temp=A[a];89A[a]=A[b];1011A[b]=temp;1......
  • Eclipse中快速定位当前文件所在的位置
    1.问题当项目中文件过多,想要快速定位编辑器中当前文件位置,该怎么做?2.解决项目中的文件比较多,有的时候需要找到某个文件在哪个文件夹下,这个时候一个一个找就浪费时间和精力了,可以借助下面这个eclipse自身的功能找到。如图,在PackageExplorer中,选中这两个箭头的按钮,点击所要看......
  • 马帮ERP与ETLCloud快速同步
    马帮ERP介绍 上海马帮科技有限公司,是一家专注于提供全流程跨境电商ERP管理软件解决方案的企业。聚焦服务于各阶段、各领域的跨境电商从业者,旗下包含专业版ERP、亚马逊专用版ERP、东南亚海外版ERP、WMS、云仓、TMS、跨境分销、SCM等产品模块,为跨境卖家搭建数字化技术基础设施,实......
  • 如何快速在钉钉群接入私有大模型
    利用阿里云计算巢Appflow,通过控制台配置即可顺利将您自己开发或微调的大模型接入钉钉或其他通信软件群聊,帮您解决以下各类场景的模型调用需求:在钉钉群接入自己微调的领域大模型做问答或智能答疑;微调后的大模型在钉钉群或其他群聊中共同测试效果......仅需简单几步,即可完成......
  • Eclipse在末尾快速键入;
    1.问题每次都要移动光标到末尾加入分号,是一件十分麻烦的事对吧,如何快速在末尾键入;呢?2.解决2.1打开Eclipse的Preferences选项,在里面找到java>Editior>Typing,并勾选如图所示选项即可2.2重点!!!如何快速键入?这里并不是VSCODE中那种保存时自动键入,而是无论你在该行何处输入一个......
  • 【C++】相对于数组,在链表中添加和删除元素更容易,但排序速度更慢。这就引出了一种可能
    相对于数组,在链表中添加和删除元素更容易,但排序速度更慢。这就引出了一种可能性:相对于使用链表算法进行排序,将链表复制到数组中,对数组进行排序,再将排序后的结果复制到链表中的速度可能更快;但这也可能占用更多的内存。请使用如下方法检验上述假设。a.创建大型vector<int>对象vi0,并......
  • 快速改善代码质量的20 条编程规范
    命名大到项目名,模块名,包名,对外暴露的接口,笑道类名,函数名,变量名,参数名。只要做开发,我们就逃不过起名字这一关,命名的好坏,对于代码的可读性来说非常中国要。甚至起到决定性的作用。除此之外,命名能力也体现了一个程序员的而基本的素养。这也是我们把命名放到第一位的原因。 取一个......
  • 基于Vue(提供Vue2/Vue3版本)和.Net Core前后端分离、强大、跨平台的快速开发框架
    前言今天大姚给大家推荐一款基于Vue(提供Vue2/Vue3版本)和.NetCore前后端分离、开源免费(MITLicense)、强大、跨平台的快速开发框架,并且框架内置代码生成器(解决重复性工作,提高开发效率),支持移动端(iOS/Android/H5/微信小程序):Vue.NetCore。提高开发生产效率、避免996可以考虑试试这......