【排序】基于快速选择算法的快排实现

目录

一、常用排序算法比较

二、快速选择算法

快速选择

图解快速选择

三、代码实现


一、常用排序算法比较

排序

时间复杂度

空间复杂度

稳定性

插入排序

O(n²)

O(1)

稳定

希尔排序

O(nlogn)-O(n²)取决于增量序列

O(1)

不稳定

选择排序

O(n²)

O(1)

不稳定

冒泡排序

O(n²)

O(1)

稳定

堆排序

O(nlogn)

O(1)

不稳定

归并排序

O(nlogn)

O(n)

稳定

快速排序

O(nlogn)

O(logn)-O(n)取决于递归深度

不稳定

二、快速选择算法

快速选择

快速选择算法(Quickselect)是用于在未排序的数组中查找第k小或第k大元素的高效算法,它的时间复杂度为O(n)。该算法与快速排序有密切的联系,但它不对整个数组进行完整的排序,而是只关注于找到所需的特定顺序的元素。以下是它的一些关键点:

  1. 基本思想
  • 选择一个基准值(pivot),按照这个基准值将数组分为两部分,左侧部分的所有元素都小于等于基准值,右侧部分的所有元素都大于基准值。
  1. 递归搜索
  • 确定基准值的位置后,根据k与基准值的位置关系,选择数组的哪一部分继续进行递归搜索。如果k小于基准值的索引,则在第一部分(小于等于基准值的部分)继续搜索;否则,在第二部分(大于基准值的部分)继续搜索。
  1. 时间复杂度
  • 快速选择算法的平均时间复杂度为O(n),但最坏情况下的时间复杂度会退化到O(n^2)。尽管如此,由于其不需要完全排序数组,它在实际操作中通常比完全的排序算法更加高效。
  1. 实际应用
  • 快速选择算法及其变种是在实际应用中最常使用的高效选择算法之一,尤其适用于解决Top K问题等场景。

总的来说,快速选择算法是一种基于快速排序的选择算法,它高效地解决了在不完全排序的数组中寻找特定顺序元素的问题,并因此在各种算法竞赛和实际应用场景中得到了广泛的使用。

图解快速选择

图解

对下面这个数组寻找到前k小的元素

首先我随机生成一个下标指向一个基准元素

然后使用一个指针指向开始位置依次往后遍历,如果当前元素比基准元素大则将该元素放在末尾,也就是基准元素后面,如果比当前元素小则将他放在基准元素前面

此时遍历指针i指向的值比基准元素大,此时需要执行以下操作进行交换:swap(arr[--e], arr[i])

此时进行将遍历指针指向的元素与基准元素进行比较依次重复此操作,当遍历指针指向的元素比基准元素小时执行:swap(arr[i++], arr[++s]) ,当与基准元素相等时只需要执行i++即可。当遍历指针与末尾指针e相遇时即可停止。

此时在l到s,e到r重复执行上述操作,知道l >= r时结束递归就是基于快速选择的快排算法。

三、代码实现

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;public class BigNumber {private static int random(int l, int r) {Random random = new Random();return random.nextInt(r - l + 1) + l;}private static void swap(int[] arr, int i, int j) {int t = arr[i];arr[i] = arr[j];arr[j] = t;}private static void qSort(int[] arr, int l, int r) {if (l >= r) return;int i = l, s = l - 1, e = r + 1, x = arr[random(l, r)];while (i < e) {if (arr[i] > x) swap(arr, --e, i);else if (arr[i] < x) swap(arr, i++, ++s);else i++;}qSort(arr, l, s);qSort(arr, e, r);}public static void main(String[] args) {int[] arr = {5,6,7,2,4,5,5,5};qSort(arr, 0, arr.length - 1);for (int x : arr) System.out.println(x);}
}
#include <iostream>
#include <cmath>
#include <cstring>
#include <vector>
#include <algorithm>using namespace std;
typedef long long ll;int random(int l, int r) {srand(time(0));return rand() % (r - l + 1) + l;
}void qsort(vector<int>& arr, int l, int r) {if (l >= r) return;int i = l, s = l - 1, e = r + 1, x = arr[random(l, r)];while (i < e) {if (arr[i] > x) swap(arr[i], arr[--e]);else if (arr[i] < x) swap(arr[i++], arr[++s]);else i++;}qsort(arr, l, s), qsort(arr, e, r);
}int main() {vector<int> arr = {7,6,6,6,5,5,4,3,2,1};qsort(arr, 0 ,arr.size() -1);for (auto x : arr) cout << x << endl;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/508202.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32(9)EXTI

EXTI工作原理 EXTI的寄存器组 每个寄存器都是20个比特位&#xff0c;对应EXTI的20路通道&#xff0c;如这6个寄存器的最左边就都是对应通道1的

Spring:EnclosingClass工具类分辨

Spring&#xff1a;EnclosingClass工具类分辨 1 前言 通过Spring的工具分辨EnclosingClass类。 测试类如下&#xff1a; package com.xiaoxu.test.enclosingClass;/*** author xiaoxu* date 2024-01-18* java_demo2:com.xiaoxu.test.enclosingClass.Outter*/ public class …

vue2 element 实现表格点击详情,返回时保留查询参数

先直观一点&#xff0c;上图 列表共5条数据&#xff0c;准备输入Author过滤条件进行查询 进入查看详情页&#xff0c;就随便搞了个按钮 啥都没调啦 点击返回后 一开始准备用vuex做这个功能&#xff0c;后来放弃了&#xff0c;想到直接用路由去做可能也不错。有时间再整一套…

Onenote软件新建笔记本时报错:无法在以下位置新建笔记本

报错现象&#xff1a; 当在OneNote软件上&#xff0c;新建笔记本时&#xff1a; 然后&#xff0c;尝试重新登录微软账户&#xff0c;也不行&#xff0c;提示报错&#xff1a; 解决办法&#xff1a; 打开一个新的记事本&#xff0c;复制粘贴以下内容&#xff1a; C:\Users\Adm…

pytest多重断言插件-pytest-assume

最近准备废弃之前用metersphere做的接口自动化&#xff0c;转战pytest了&#xff0c;先来分享下最近接触到的一个插件&#xff1a;pytest-assume。 在使用这个插件之前&#xff0c;如果一个用例里面有多个断言的话&#xff0c;前面的断言失败了&#xff0c;就不会去执行后面的断…

MATLAB环境下基于区域椭圆拟合的细胞分割方法

使用图像分割技术可以找到图像中的目标区域&#xff0c;目标区域可以定义为具有特定值的单个区域&#xff0c;也可以定义为具有相同值的多个区域。目前图像分割已经融入到生活中的方方面面&#xff0c;在遥感领域&#xff0c;它应用于航拍图中的地形、地貌的分割&#xff1b;在…

如何防止 Elasticsearch 服务 OOM ?

ES 和传统关系型数据库有很多区别&#xff0c; 比如传统数据中普遍都有一个叫“最大连接数”的设置。目的是使数据库系统工作在可控的负载下&#xff0c;避免出现负载过高&#xff0c;资源耗尽&#xff0c;谁也无法登录的局面。 那 ES 在这方面有类似参数吗&#xff1f;答案是…

中科大计网学习记录笔记(十七):拥塞控制原理 | TCP 拥塞控制

前言&#xff1a; 学习视频&#xff1a;中科大郑烇、杨坚全套《计算机网络&#xff08;自顶向下方法 第7版&#xff0c;James F.Kurose&#xff0c;Keith W.Ross&#xff09;》课程 该视频是B站非常著名的计网学习视频&#xff0c;但相信很多朋友和我一样在听完前面的部分发现信…

LeetCode第125场双周赛个人题解

目录 100231. 超过阈值的最少操作数 I 原题链接 思路分析 AC代码 100232. 超过阈值的最少操作数 II 原题链接 思路分析 AC代码 100226. 在带权树网络中统计可连接服务器对数目 原题链接 思路分析 AC代码 100210. 最大节点价值之和 原题链接 思路分析 AC代码 10023…

Linux:kubernetes(k8s)部署CNI网络插件(4)

在上一章进行了node加入master Linux&#xff1a;kubernetes&#xff08;k8s&#xff09;node节点加入master主节点&#xff08;3&#xff09;-CSDN博客https://blog.csdn.net/w14768855/article/details/136420447?spm1001.2014.3001.5501 但是他们显示还是没准备好 看一下…

python科学计算库之Numpy库的使用的简单习题

Numpy库 Numpy&#xff08;Numerical Python的缩写&#xff09;是一个开源的Python库&#xff0c;用于进行科学计算。它提供了一个高性能的多维数组对象&#xff08;ndarray&#xff09;及用于处理这些数组的各种工具和函数。由于其高效和灵活的数据结构以及丰富的功能&#x…

芯片的制造详解(1)——沙子到晶圆

哔哩哔哩视频 up:谈三圈&#xff08;2021/8月内容&#xff09; 芯片的制造流程、工艺、设备 面临困境&#xff1a; 国产芯片卡脖子的地方&#xff1a;制造芯片&#xff08;制造过程中的一系列设备和和材料&#xff09;包括但不限于&#xff1a;光刻机、光刻胶、薄膜沉积设备、…