快速排序就这么简单

Python实现快速排序算法及去重的快速排序的简单示例 @本文来源于公众号:csdn2299,喜欢可以关注公众号 程序员学府 quick sort快速排序是一种再基础不过的排序算法,使用Python代码写起来相当简洁,这里我们就来看一下Python实现快速排序算法及去重的快速排序的简单示例: quick sort快速排序是一种再基础不过的排序算法,使用Python代码写起来相当简洁,这里我们就来看一下Python实现快速排序算法及去重的快速排序的简单示... 阅读详情

快速排序就这么简单

从前面已经讲解了冒泡排序、选择排序、插入排序了,本章主要讲解的是快速排序,希望大家看完能够理解并手写出快速排序的代码,然后就通过面试了!如果我写得有错误的地方也请大家在评论下指出。

快速排序的介绍

来源百度百科:

快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

快速排序是面试出现的可能性比较高的,也是经常会用到的一种排序,应该重点掌握。

前面一个章节已经讲了递归了,那么现在来看快速排序就非常简单了。

一、第一趟快速排序

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小

百度百科的话并没有说到重点,更简单的理解是这样的:在数组中找一个支点(任意),经过一趟排序后,支点左边的数都要比支点小,支点右边的数都要比支点大!

现在我们有一个数组:int arr[]={1,4,5,67,2,7,8,6,9,44};

经过一趟排序之后,如果我选择数组中间的数作为支点:7(任意的),那么第一趟排序后的结果是这样的:{1,4,5,6,2,7,8,67,9,44}

那么就实现了支点左边的数比支点小,支点右边的数比支点大

二、递归分析与代码实现

现在我们的数组是这样的:{1,4,5,6,2,7,8,67,9,44},既然我们比7小的在左边,比7大的在右边,那么我们只要将”左边“的排好顺序,又将”右边“的排好序,那整个数组是不是就有序了?想一想,是不是?

又回顾一下递归:”左边“的排好顺序,”右边“的排好序,跟我们第一趟排序的做法是不是一致的?

只不过是参数不一样:第一趟排序是任选了一个支点,比支点小的在左边,比支点大的在右边。那么,我们想要”左边“的排好顺序,只要在”左边“部分找一个支点,比支点小的在左边,比支点大的在右边。

…………..

在数组中使用递归依照我的惯性,往往定义两个变量:L和R,L指向第一个数组元素,R指向在最后一个数组元素

递归出口也很容易找到:如果数组只有一个元素时,那么就不用排序了

所以,我们可以写出这样的代码:



    public static void main(String[] args) {
        int[] arr = {1, 4, 5, 67, 2, 7, 8, 6, 9, 44};

        quickSort(arr, 0, 9);

        System.out.println("Java3y   " + arr);


    }

    /**
     * 快速排序
     *
     * @param arr
     * @param L   指向数组第一个元素
     * @param R   指向数组最后一个元素
     */
    public static void quickSort(int[] arr, int L, int R) {
        int i = L;
        int j = R;

        //支点
        int pivot = arr[(L + R) / 2];

        //左右两端进行扫描,只要两端还没有交替,就一直扫描
        while (i <= j) {

            //寻找直到比支点大的数
            while (pivot > arr[i])
                i++;

            //寻找直到比支点小的数
            while (pivot < arr[j])
                j--;

            //此时已经分别找到了比支点小的数(右边)、比支点大的数(左边),它们进行交换
            if (i <= j) {
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
                i++;
                j--;
            }
        }
        //上面一个while保证了第一趟排序支点的左边比支点小,支点的右边比支点大了。


        //“左边”再做排序,直到左边剩下一个数(递归出口)
        if (L < j)
            quickSort(arr, L, j);

        //“右边”再做排序,直到右边剩下一个数(递归出口)
        if (i < R)
            quickSort(arr, i, R);
    }

三、快速排序优化

来源:http://www.cnblogs.com/noKing/archive/2017/11/29/7922397.html

我这里简单概括一下思路,有兴趣的同学可到上面的链接上阅读:

  • 随机选取基准值base(支点随机选取)
  • 配合着使用插入排序(当问题规模较小时,近乎有序时,插入排序表现的很好)
  • 当大量数据,且重复数多时,用三路快排

四、扩展阅读

原理都是一样的,在细节上有些变化而已

  • 它是交换完毕后记录支点的角标,然后再劈开两半进行递归调用

C语言代码实现:



        void QuickSort ( int*arr,int low, int high);
        int FindPos ( int*arr,int low, int high);


        int FindPos ( int*arr,int low, int high)
        {
            int val = arr[low];

            while (low < high) {
                while (low < high && arr[high] >= val)
                    --high;
                arr[low] = arr[high];
                while (low < high && arr[low] <= val)
                    ++low;
                arr[high] = arr[low];
            }
            arr[low] = val;
            return low;
        }


        void QuickSort ( int arr[], int low, int high)
        {
            int pos;
            if (low < high) {
                pos = FindPos(arr, low, high);
                QuickSort(arr, low, pos - 1);//劈两半,左边 
                QuickSort(arr, pos + 1, high); //右边 
            }
            return;
        }

        int main ()
        {
            int arr[ 6]={ 5, 3, -88, 77, 44, -1 } ;
            int i;
            QuickSort(arr, 0, 5);
            for (i = 0; i < 6; i++)
                printf("%d   ", arr[i]);
            printf("\n");
            return 0;
        }

如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:Java3y

极坐标格式算法(PFA)-SAR成像算法系列(六) SAR成像算法:极坐标格式算法,介绍了算法的基本原理以及实现步骤,包含dechirp处理、RVP补偿,距离插值、方位插值。文后附有代码,可根据自身情况下载。 阅读详情

相关推荐

Zynq 双核AMP 通信

4、配置离线编译(这里不讲),配置linux的内核地址空间(0x4000_0000改为0x2000_0000),以及单核启动。CPU1设置为0x2000_0000~0x3FFF_FFFF(也可以小于0x3FFF_FFFF)如果禁用CPU1的L2 cache,在CPU1的bsp里面添加编译时候所需要的宏。3、配置工程,将vivado产生的.xsa文件复制到amp_com项目目录下。9、使用petalinux-package --boot 打包。一、vivado工程。5、编译u-boot。

y183128184的博客 1087

手写数组快速排序(多种写法)

1. 简介  快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。 2. 算法步骤 ① 从数列中挑出一个元素,称为 “基准”(pivot); ② 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在

weixin_45242865的博客 5462

C51:PWM+舵机角度控制

PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是50%.脉冲宽度调制通过占空比编码模拟信号一个周期内,高电平占据时长的百分比如下图所示,最便宜的舵机sg90,常用三根或者四根接线,黄色为PWM信号控制。

qq_73379310的博客 3388

手写快速排序

快速排序简介快速排序是一种很不错的排序算法,算法复杂度为n*logn。快排使用了分而治之的思想,每次排序是都找到一个基准(我们学习时经常使用第一个作为基准),然后把小于基准的元素放到基准元素的左边,大于基准的元素放到基准元素的右边,这样一次排序下来,基准元素左边都是小于(等于)基准的数,基准右边的元素都是大于(等于)基准的元素了。快速排序关键点就是找到这样一个基准并将其放到恰到的位置。算法思路定义一

God Liao On The Way 1万+

【滤波跟踪】多雷达协同下的多目标跟踪:航迹管理优化与卡尔曼滤波融合策略

本文深入探讨了多雷达协同下的多目标跟踪技术,聚焦于航迹管理优化与卡尔曼滤波融合策略两大核心。通过分析分布式融合架构、航迹关联算法(如匈牙利算法)以及应对非线性与机动目标的扩展卡尔曼滤波(EKF)与无迹卡尔曼滤波(UKF)等方法,旨在解决多源信息融合难题,提升复杂环境下目标跟踪的精度与鲁棒性。

weixin_29214199的博客 281

二、基于C语言的JPEG解码代码详解

// JPEG解码 // 输入JPEG后输出Bitmap #include <stdio.h> #include <stdlib.h> #pragma warning(disable : 4996) unsigned int BuffIndex; // JPEG数据的位置 unsigned int BuffSize; // JPEG数据的大小 unsigned int BuffX; // 图像的横向尺寸 unsigned int BuffY; //

m0_37633745的博客 4455

手写快速排序代码

一、快速排序简介 快速排序(Quick Sort)是由冒泡排序改进而来的,冒泡排序一次交换只能消除一个逆序,效率比较低,如果能通过一次交换消除多个逆序,那么会提高排序效率,快速排序就具有这样的功能。 快速排序的原理是选定一个中心点middle,通过一次排序,将不大于middle的元素都放在了其左侧,不小于middle的元素都放在了右侧,再对其左右区间进行类似的操作,直到所有区间长度为1。 快速排序的基本方法: (1)选定一个基准值middle (2...

littlecorner1205的博客 690

小米CyberGear微电机驱动代码(CAN总线驱动,含开源地址)

小米CyberGear微电机驱动代码(ROS下的CAN总线驱动,含开源地址)

2302_80751833的博客 4434

【数据结构】手写快速排序

什么是快速排序?首先确立pivot,比如下图位于末尾然后i遍历3到6在3的时候,j指向i前面一位如果3

qq_59143106的博客 687

OCR文字识别基础

ocr文字识别

m0_47405013的博客 1755

知识图谱开发实战:搭建上市公司知识图谱(二)

搭建上市公司知识图谱(二)学习目标1. 获取上市公司公开数据1.1 获取上市公司列表与行业信息1.2 代码展示2. 从网站爬取上市公司网页并存储为 HTML文件2.1 准备环境2.2 爬取上市公司公开信息3. 解析HTML文件,获取高管信息并存储为 csv 文件4. 设计知识图谱数据库4.1 实体4.2 关系4.3 属性4.4 特殊4.5 代码5. 知识图谱数据库查询实战5.1 实战:按照neo4j的数据格式,转换CSV文件5.2 实战:使用neo4j-admin 导入数据5.3 实战:使用neo4j-b

全网粉丝30W+,优快云、稀土掘金人工智能领域签约作者,人工智能、大模型、Python 爬虫,商务合作,请私信沟通。 2094

《面试系列篇》——快速排序详解

快速排序的递归算法了解一下

程序大视界 902

汽车LIN总线(3) -- 协议层:帧的类型

主要介绍LIN协议层中帧的类型,介绍中加入一点自己的理解(带下划线的是,其余是官方资料)。

晴朗luo的博客 889

简单快速排序

采用哨兵投石法理解简单快速排序,这是理解双轴排序的基础,双轴排序表面简单,但根据java工业程序来看,发展历次更迭,已经有些难以理解了,之后我又添加一些逻辑可能会导致逻辑判断过多,失去算法的本真。所以先采用最简单的基准值选取思路,就是开头结尾选基准值。 # -*- coding: utf-8 -*- """ ------------------------------------------------- 开发人员:Edwin 开发日期: 开发工具:PyCharm 功能.

闲来之笔 810

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

快速排序java简单实现

Java代码实现简单的快速排序 public class QuickSort { public static void quickSort(int[] arr,int low,int high){ int i,j,temp,t; if(low>high){ return; } i=low; ...

渡城的博客 2030

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

C++简单的快速排序

C++简单的快速排序 代码描述 写一个快速排序将int型数组由小到大排序 我的代码 #include <iostream> //写一个快速排序 using namespace std; void quicksort(int* ,int ,int ); void swap(int &,int &); int main() { cout<<"Please e...

Keith L的博客 270

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

简单选择,冒泡,快速排序

1、简单选择排序:设所排序序列的记录个数为n。i取1,2,…,n-1,从所有n-i+1个记录(Ri,Ri+1,…,Rn)中找出排序码最小的记录,与第i个记录交换。执行n-1趟 后就完成了记录序列的排序。 2、冒泡排序:从前向后依次比较,如果前面一个比后面一个小就交换,依次下去就选出一个最小的。如此下去,第二次选出第二小的,这样下去一直到排好为止。 冒泡排序算法:     1)初始 ...

dianbiao4727的博客 110

快速排序的简单写法

快速排序的简单写法

_Li的博客 600

C++实现——简单快速排序

C++的简单快速排序,每次选取数组的最后一个元素值作为划分子数组的关键字,将小于关键字的放在前面,大于的放在后面。

qq_39542725的博客 778

简单算法之快速排序

写了好多业务,总感觉心里很不踏实。今天就写一个简单的排序算法->快速排序,转转脑子,不然真的长锈了。 package com.chasen; public class QuickSort { public static void main(String[] args) { int[] arr = {100, 6, 1, 2, 7, 9, 3, 4, 5, 10, 8}; quickSort(arr, 0, arr.length - 1); ...

ChasenZh的博客 263

算法笔记(五):快速排序和简单选择排序

(一) 快速排序 按照快速排序的思想,对数组A[p…r]进行排序。 1、 选择一个基准A[q],调整数组,确保满足下面2个条件。 a) A[p…q-1] 的数据都小于等于 A[q] b) A[q+1…r] 的数据都大于A[q] 2、 对A[p…q-1] 和 A[q+1…r]重复1步骤 例如:对列表[12,7,9,...

anbipan1507的博客 816

快速排序的一种较简单写法

快速排序的一种较简单写法(C语言) 文中的快速排序实际上是快速找到首位元素的实际位置并放置,接着通过二分法,进行递归查找放置,完成排序。 先放代码 void quicksort(int *a,int low,int high) { int i=low, j=high; if(i<j) return; int temp=a[low]; while(i<j) { whi...

歪歪匠 1231

快速排序的简单实现

快速排序为什么能快呢?   结合分治的车略

蜗牛不会飞 621

【算法】简单好记的快速排序

之前看到一个招聘,有一行醒目的要求:“15分钟写不出快排的勿扰。”吓得我赶紧回忆了一下快速排序。下面开始说正题快速排序作为排序算法之王,还是很有必要掌握一下的,不用被那繁琐的过程吓倒,其实本质还是比较简单的。下面来介绍一种好写(背)的快速排序C++代码。切分部分代码:int partition(int arr[], int low, int high) { int pivot = arr[

若人生可以时序差分 642

C++:简单实现快速排序

声明:本文全部内容为原创内容,禁止在未经授权的情况下进行任何二次创作和修改,转载请注明出处。 摘要 这篇文章将会讲解如何用C++实现快速排序算法。尽管STL库中已提供了排序函数,但是理解如何通过简单的循环实现快速排序算法还是有必要的。 原理 对于快速排序算法更简洁的理解,可访问网站https://visualgo.net/。 C++代码 #include <iostream> #include <vector> #include <stdio.h> using name

david394的博客 657
上一篇: Shiro入门这篇就够了【Shiro的基础知识、回顾URL拦截】
下一篇: Shiro【授权、整合Spirng、Shiro过滤器】
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值