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

快速排序

时间:2023-03-21 21:25:20浏览次数:34  
标签:sort do 右边 int while quick 排序 快速

快速排序

算法思想

  • 找一个主元 x
  • 从左边找 >= x 的数,从右边找 <= x 的数然后交换位置
  • 递归地处理左右两部分

时间复杂度

O(n logn)

代码

void quick_sort(int q[], int l, int r)
{
    if (l >= r) return;
    int i = l - 1, j = r + 1, x = q[l + r >> 1];
    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);
}

快速选择

算法思想

  • 记要找第 k 个数
  • 找一个主元 x
  • 从左边找 >= x 的数,从右边找 <= x 的数然后交换位置
  • 记此时 <= x 的个数为 sl
    • 如果 k <= sl,递归左边
    • 否则递归右边,此时找的是右边的第 k - sl 个数

时间复杂度

O(n)

代码

int quick_select(int q[], int l, int r, int k)
{
    if (l == r) return q[l];
    int i = l - 1, j = r + 1, x = q[l + r >> 1];
    while (i < j) {
        do i++; while (q[i] < x);
        do j--; while (q[j] > x);
        if (i < j) swap(q[i], q[j]);
    }
    int sl = j - l + 1;
    if (k <= sl) return quick_select(q, l, j, k);
    else return quick_select(q, j + 1, r, k - sl);
}

标签:sort,do,右边,int,while,quick,排序,快速
From: https://www.cnblogs.com/cong0221/p/17241488.html

相关文章

  • Vue2 快速上手
    1.声明式渲染通过{{}}将数据渲染到页面:<body><divid="app">{{message}}</div></body><script>varapp=newVue({el:'#app',......
  • 开源API网关APINTO:快速入门
    公司领导对选型APINTO网关比较满意,自然少不了体验一下。首先来体验一下API网关最基本的功能:转发请求。Apinto快速入门从Apinto官网扒了个配置流程图,Apinto网关控制台主......
  • java实现多字段排序(普通对象List和MapList)
    publicclassSortTest{publicstaticvoidmain(String[]args){//普通对象listsortVOList();//mapListsortMapList();......
  • WebSocket + Redis简单快速实现Web网站单设备登录功能
    大家好,我是小悟1、写在前面的话生活中,我们在使用一些APP的时候,有过一种体验,就是在A手机上登录账号,因为某些原因需要在B手机上登录,然后就会在A手机上看到类似"该账号在其他设......
  • Jenkins核心功能快速上手Jenkins企业级持续集成持续部署CICD
     Jenkins核心功能快速上手Jenkins企业级持续集成持续部署CICD主要负责容器云平台产品架构及设计.8年工作经验,有着企业级存储,云计算解决方案相关理解.关注于微......
  • Treemap按key和value降序排序
    Treemap是一种根据键排序的数据结构,可以通过重载它的比较器来按照值排序。要按键排序,可以使用默认的比较器,而要按值排序,可以创建一个自定义的比较器并将其传递给treemap的......
  • orcad 快速差走器件的两种方法
    第一种方法:适用于整个原理图操作    第二种方法:使用与某张原理图操作     ......
  • 【数据结构与算法】堆与堆排序
    堆与堆排序1堆的概念堆用于维护一个数集。堆是一个完全二叉树小根堆:每个结点都小于等于它的左右子结点(递归定义)推论:每个结点都是以其为根节点的子树的最小值......
  • 26.删除排序数组中的重复项——学习笔记
    题目:给你一个升序排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。由于在某些语言中不能改变数组......
  • 34.在排序数组中查找元素的第一个和最后一个位置——学习笔记
    题目:给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回[-1,-1]。......