【数据结构】快速排序

news2025/1/18 9:51:49

快速排序是一种高效的排序算法,其基本思想是分治法。它将一个大问题分解成若干个小问题进行解决,最后将这些解合并得到最终结果。

快速排序的主要思路如下:

  1. 选择一个基准元素:从待排序的数组中选择一个元素作为基准(pivot)。通常选择第一个元素、最后一个元素或者随机选择一个元素作为基准。
  2. 划分操作:将数组中的元素按照与基准的大小关系分成两部分,一部分小于基准,一部分大于基准。基准元素的选择决定了这个划分的位置。
  3. 递归排序:对划分后的两个子数组分别进行快速排序,即递归地调用快速排序函数,直到子数组的大小为1或0时终止递归。
  4. 合并结果:递归的终止条件是子数组的大小为1或0,此时子数组已经是有序的。然后将有序的子数组合并成一个有序的数组,整个排序过程完成。

快速排序的关键在于划分操作,通过每次划分将元素按照大小分开,使得在每次递归中,排序的元素数量逐渐减少,从而达到快速排序的效果。由于快速排序采用分治法,并且在平均情况下具有很好的时间复杂度(O(n log n)),因此它在实际应用中是一种较为常用的排序算法。然而,最坏情况下的时间复杂度为O(n^2),这可以通过合理选择基准元素或采用随机化的方法进行优化。

实现步骤

首先设置一个数组,先找到最左侧和最右侧
在这里插入图片描述
我们以left为pivot,如果比他大,就和right交换,right–,如果比pivot小,那么left和left+1交换,left++
在这里插入图片描述
这里5>3,所以left+1与right交换,right–
在这里插入图片描述
再次判断,4>3,所以接着与right交换
在这里插入图片描述
第三次判断 3>2 所以left和left+1交换,left++
在这里插入图片描述
第四次判断,3>1,所以left和left+1交换,left++
在这里插入图片描述
这里可以看见left已经和right重合了,此时以3为pivot,左边全小于3,而右边全部大于3
这一个回合就完成了,而我们要做的就是如果左右的数组长度大于1,那么就拆分出来重新做上述的拆分,然后排序
在这里插入图片描述
这就是快速排序的整体思路
下面给出快速排序的Java,C++,Python代码
Java:

public class QuickSort {
    public static void main(String[] args) {
        int[] arr = {153,134,153,14,196,4,616,435,156,1561,683,561,651,685,46,42};
        sort(0, arr.length-1,arr);
        System.out.println(Arrays.toString(arr));
    }

    public static void sort(int left, int right,int[] array){
        int startIndex = left;
        int endIndex = right;

        while (left < right){
            if (array[left] >= array[left+1]){
                int temp = array[left];
                array[left] = array[left+1];
                array[left+1] = temp;
                left++;
            }else {
                int temp = array[left + 1];
                array[left + 1] = array[right];
                array[right] = temp;
                right--;
            }
        }

        if (left - startIndex -1 > 0){
            sort(startIndex,left-1,array);
        }
        if(endIndex - left - 1 > 0){
            sort(left+1,endIndex,array);
        }
    }
}

C++:

#include <iostream>
#include <vector>

void quick_sort(std::vector<int>& array, int left, int right) {
    int startIndex = left;
    int endIndex = right;

    while (left < right) {
        if (array[left] >= array[left + 1]) {
            int temp = array[left];
            array[left] = array[left + 1];
            array[left + 1] = temp;
            left++;
        } else {
            int temp = array[left + 1];
            array[left + 1] = array[right];
            array[right] = temp;
            right--;
        }
    }

    if (left - startIndex - 1 > 0) {
        quick_sort(array, startIndex, left - 1);
    }
    if (endIndex - left - 1 > 0) {
        quick_sort(array, left + 1, endIndex);
    }
}

int main() {
    std::vector<int> arr = {153, 134, 153, 14, 196, 4, 616, 435, 156, 1561, 683, 561, 651, 685, 46, 42};
    quick_sort(arr, 0, arr.size() - 1);

    for (int i = 0; i < arr.size(); i++) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

Python:

def quick_sort(array):
    if len(array) <= 1:
        return array

    pivot = array[0]
    left = [x for x in array[1:] if x <= pivot]
    right = [x for x in array[1:] if x > pivot]

    return quick_sort(left) + [pivot] + quick_sort(right)

arr = [153, 134, 153, 14, 196, 4, 616, 435, 156, 1561, 683, 561, 651, 685, 46, 42]
sorted_arr = quick_sort(arr)
print(sorted_arr)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DataBase 1. kaggle 发现无法显示验证码进行人机交互怎么办?

这期开始增加一个系列就是我们经常用到的数据库或者网站&#xff0c;便于我们查找数据&#xff0c;在线分析数据&#xff0c;若能很好的利用别人的工具&#xff0c;就没必要自己一句一句码代码&#xff0c;最主要的是不断出现各种bug处理不了&#xff0c;东问西问搞不定&#x…

css在线代码生成器

这里收集了许多有意思的css效果在线代码生成器适合每一位前端开发者 布局&#xff0c;效果类&#xff1a; 网格生成器https://cssgrid-generator.netlify.app/ CSS Grid Generator可帮助开发人员使用CSS Grid创建复杂的网格布局。网格布局是创建Web页面的灵活和响应式设计的强…

面试题学习以及问题

redis redis缓存 缓存穿透 布隆过滤器主要是用于检索一个元素是否在一个集合中。我们当时使用的是 redisson实现的布隆过滤器。 它的底层主要是先去初始化一个比较大数组&#xff0c;里面存放的二进制0或1。在一 开始都是0&#xff0c;当一个key来了之后经过3次hash计算&…

C#--调用Python(包含第三方库)

1. C# 调用 Python 常见的方法有4种 参考链接 1.1 Pythonnet &#xff08;推荐&#xff09; 可以很好的支持第三方库。 推荐这个&#xff0c;经本人验证这个很好用。 后文 2. 详细使用。 1.2 IronPython 如果使用第三方库就放弃这个吧&#xff0c;真的用不了&#xff0c;使…

大规模向量检索库Faiss学习总结记录

因为最近要使用到faiss来做检索和查询&#xff0c;所以这里只好抽出点时间来学习下&#xff0c;本文主要是自己最近学习的记录&#xff0c;来源于网络资料查询总结&#xff0c;仅用作个人学习总结记录。 Faiss的全称是Facebook AI Similarity Search&#xff0c;是FaceBook的A…

【C语言进阶篇】结构体都学完了,那么现造第一个通讯录呢?(内附源码)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言一 、 通讯录的简介1.1 联系人的类型定义1.2 通讯录的定义1.3 通讯录要实现的功能 二 、 如何…

Android平台如何实时叠加电量信息和设备信号状态到GB28181接入端

技术背景 我们在Android平台实现GB28181设备接入&#xff0c;把摄像头和麦克风数据&#xff0c;采集过去&#xff0c;用于移动单兵、智能车载、智慧安防、智能家居、工业仿真等行业时&#xff0c;发现大多场景对视频水印的要求越来越高&#xff0c;从之前的固定位置静态文字水…

Python(六十)字典的创建

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

Kubernetes——理论基础

Kubernetes——理论基础 一、Kubernetes 概述1.K8S 是什么&#xff1f;2.为什么要用 K8S?3.Kubernetes 主要功能 二、Kubernetes 集群架构与组件三、Master 组件1.Kube-apiserver2.Kube-controller-manager3.Kube-scheduler4.配置存储中心——etcd 四、Node 组件1.Kubelet2.Ku…

城市供水管网水力模型的基本概念及理论

1.1引言 城市供水管网系统由大量管材各异、管径各异、铺设年代各异的管道&#xff0c;泵站&#xff0c;阀门&#xff0c; 水塔等多元素构成&#xff0c;因此决定了供水管网系统是一个拓扑结构庞杂、运行工况多变的巨系统。以前国内供水公司对铺设在地面以下的供水管网多以经验…

HCIP的mgre实验

题目 拓扑图 IP地址配置和缺省 R1 [r1]int g0/0/1 [r1-GigabitEthernet0/0/1]ip add 192.168.1.1 24 Aug 2 2023 20:38:20-08:00 r1 %%01IFNET/4/LINK_STATE(l)[0]:The line protocol IP on the interface GigabitEthernet0/0/1 has entered the UP state. [r1-GigabitEtherne…

【雕爷学编程】Arduino动手做(181)---Maixduino AI开发板4

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

云环境中使用飞蛾火焰和萨尔普群算法组合的工作流调度(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

AcWing 202. 最幸运的数字

AcWing 202. 最幸运的数字 思路&#xff1a; Code: #include<bits/stdc.h> using namespace std; typedef long long LL; int gcd(LL n,int m) {return m?gcd(m,n%m):n; } LL get_euler(LL x) { //求欧拉函数LL resx;for(int i2;i<x/i;i) {if(x%i0) {while(x%i0)…

经典CNN(三):DenseNet算法实战与解析

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 1 前言 在计算机视觉领域&#xff0c;卷积神经网络&#xff08;CNN&#xff09;已经成为最主流的方法&#xff0c;比如GoogleNet&#xff0c;…

结算功能实现(小兔鲜儿)【Vue3】

退出登录 - 清空购物车列表 业务需求 在用户退出登录时,除了清除用户信息之外,也需要把购物车数据清空 // 清除购物车const clearCart () > {cartList.value []}// 退出时清除用户信息const clearUserInfo () > {userInfo.value {}// 执行清除购物车的actioncartS…

2023年攻防演练利器之必修高危漏洞合集(包含详细修复建议)

2023年攻防演练利器之必修高危漏洞合集&#xff08;包含详细修复建议&#xff09; 下载地址见盘&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1WeCC7oXFieDs4tBOh7bmWA?pwd12u4 提取码&#xff1a;12u4

PyTorch 中的累积梯度

https://stackoverflow.com/questions/62067400/understanding-accumulated-gradients-in-pytorch 有一个小的计算图&#xff0c;两次前向梯度累积的结果&#xff0c;可以看到梯度是严格相等的。 代码&#xff1a; import numpy as np import torchclass ExampleLinear(torch…

MongoDB文档--基本安装-linux安装(mongodb环境搭建)-docker安装(挂载数据卷)-以及详细版本对比

阿丹&#xff1a; 前面了解了mongodb的一些基本概念。本节文章对安装mongodb进行讲解以及汇总。 官网教程如下&#xff1a; 安装 MongoDB - MongoDB-CN-Manual 版本特性 下面是各个版本的选择请在安装以及选择版本的时候参考一下&#xff1a; MongoDB 2.x 版本&#xff1a…

TensorRT学习笔记--基于YoloV8检测图片和视频

1--完整项目 完整项目地址&#xff1a;https://github.com/liujf69/TensorRT-Demo git clone https://github.com/liujf69/TensorRT-Demo.gitcd TRT_YoloV8 2--模型转换 cd yolov8python gen_wts.py 3--编译项目 mkdir buildcd build cmake .. # 需要更改 CMakeLists.txt…