快速排序算法

47 篇文章 5 订阅
订阅专栏
33 篇文章 2 订阅
订阅专栏
9 篇文章 1 订阅
订阅专栏

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

我们来看看一趟排序中如何将数据划分为两部分,使得左边部分比给定元素小,而右边部分比给定元素大。
首先,我们选定一个数字作为中轴元素用于划分数据,我们选择数据的第一个元素。
然后,我们定义两个指针,分别指向数据的首(i)和尾(j)。从后面(j)元素开始进行比较,如果j指向的元素大于等于中轴元素,则j–,向前移动一位;否则,交换i和j位置的元素。然后,从前面(i)元素比较,如果i指向的元素小于等于中轴,则i++,向后移动一位;否则,交换i和j位置的元素。这样一直循环,知道i==j为止。这样就完成了一次划分,我们选择的中轴元素刚好位于i(此时,i等于j)位置上。

下面是一个示意图:
快速排序

下面给出Java的实现:

package cn.tzy;

import java.util.Arrays;

public class SortAlg {
    public static void main(String[] args) {
        int[] numbers = {5, 1, 6, 7, 0, 4, 2, 3};
        quickSort(numbers, 0, numbers.length - 1);
        System.out.println(Arrays.toString(numbers));
    }

    public static void swap(int[] numbers, int i, int j) {
        if (numbers[i] == numbers[j]) return;
        numbers[i] = numbers[i] ^ numbers[j];
        numbers[j] = numbers[i] ^ numbers[j];
        numbers[i] = numbers[i] ^ numbers[j];
    }

    public static void quickSort(int[] numbers, int low, int high) {
        if (numbers.length < 2) return;
        if (low >= high) return;

        int left = low;
        int right = high;
        int pivot = numbers[low];
        while (left < right) {
            while (left < right && numbers[right] >= pivot) right--;
            swap(numbers, left, right);
            while (left < right && numbers[left] <= pivot) left++;
            swap(numbers, left, right);
        }

        quickSort(numbers, low, right - 1);
        quickSort(numbers, left + 1, high);
    }
}

我们再来看看用Scala的函数式编程思想如何实现:

package cn.tzy

object SortAlg {
  def quickSort(numbers: List[Int]): List[Int] = {
    if (numbers.length < 2) numbers
    else {
      quickSort(numbers.filter(_ < numbers.head)) ++
        numbers.filter(_ == numbers.head) ++
        quickSort(numbers.filter(_ > numbers.head))
    }
  }

  def main(args: Array[String]): Unit = {
    val numbers = List(5, 1, 6, 7, 0, 4, 2, 3)
    println(numbers)
    val sortedNumbers = quickSort(numbers)
    println(sortedNumbers)
  }
}

有没有感受到函数式编程的简介,我们使用filter函数找出比中轴元素小的,然后是中轴元素,再接着是比中轴元素小。短短几行代码就完成了Java很多行代码的功能!

多进程实现快速排序(北京大学操作系统课程实习)
11-22
是北京大学陈向群老师的操作系统课程的实习作业 在 Windows Windows 环境下,编写一 个多进程行快速排序的,使用是包含 1,000 ,000 000个随机数的文件 随机数的文件 随机数的文件
图解快排——快速排序算法(quick sort)
热门推荐
仅以此博客记录日常学习工作中所思所得,水平有限,难登大雅,万望海涵。
07-07 3万+
快速排序算法是对冒泡排序算法的一种改进算法,在当前所有内部排序算法中,快速排序算法被认为是最好的排序算法之一。
多进程多线程快速排序C++源码
04-16
这是在WINDOWS下实现的多进程多线程的快速排序程序,其中为了加快排序速度使用了文件映射技术。
Java 快速排序算法
07-21
Java 快速排序,目前来说效率很高的一种排序算法,好理解。
C语言实现快速排序算法
08-27
主要为大家详细介绍了C语言实现快速排序算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
FPGA并行快速排序算法-位宽可设
11-24
只需两个时钟即可输出12个数据的排序结果,内容简单易懂
Java基于分治法实现的快速排序算法示例
08-28
主要介绍了Java基于分治法实现的快速排序算法,结合实例形式分析了java基于分治法的快速排序相关实现技巧,代码中备有较为详细的注释说明便于理解,需要的朋友可以参考下
算法设计与分析快速排序算法
06-13
算法的学习,分治
java实现快速排序算法
最新发布
06-14
quickSort 方法实现了快速排序算法。通过选取一个基准值,将数组划分为左右两个子数组,并递归调用快速排序对子数组进行排序。在 partition 方法中,我们选择最右边的元素作为基准值,然后使用双指针进行比较和交换...
第六章第五题(对三个数排序)(Sort three numbers)
xjlovewjh的博客
02-26 1876
下面是参考答案代码: 运行效果: 注:编写程序要养成良好习惯 1.文件名要用英文,具体一点 2.注释要英文 3.变量命名要具体,不要抽象(如:a,b,c等等),形式要驼峰化 4.整体书写风格要统一(不要这里是驼峰,那里是下划线,这里的逻辑段落空三行,那里相同的逻辑段落空5行等等) 5.普通变量,方法名要小驼峰,类名要大驼峰,常量要使用全部大写加上下划线命名法 6.要学习相应的代码编辑器的一些常用快...
用多线程进行的序列快速排序
qq_19408603的博客
07-16 1280
本质上是选择最前面的一个数作为分割线,以此为分割。 在此基础上进行迭代,终点关注下使用lambda表达式 [&](T const& t) {return t 然后是使用了partion 和splice两个stl算法里面的代码 下面是原始的快速排序代码 template list sequential_quick_sort(list input) { if (input.empt
地理信息系统1之快速排序(Quick Sort)
mrzkilin的博客
03-25 107
中心思想就是 随机找一个pivot(也就是随机选择一个数) 然后左边一个指针,右边一个指针, 左指针往右移, 右指针往左移, 当左指针遇到比pivot大的数就停下, 当右指针遇到比pivot小的数也停下, 然后交换这两个数.继续移动这两个指针,当左右指针相遇时(也就是指向同一个数时)停下, 将这个数和pivot交换.此时pivot就已经完成了其排序. 剩下的数可以分为pivot左半边和pivot右...
java 快速排序的思想及解释说明
远方的行者
08-15 3579
快速排序在应用上很广泛,大家有知道二分法,二分法在排好序的数组中查找数据是最快的 快速排序是在无序的数组中排序、查找都是最快的 如今大数据时代,在数据量如此之大的情况下查找的速度是很重要的,那么认识快速排序的思想是很重要的,
Java实现快速排序算法
jianjun200607的专栏
06-16 557
快排算法思想:首先找一个值作为基准,一般是第一个值作为基准,假设基准值为key,然后分别定义start为i,end为j,将基准值key与j比较,如果比j小则j--继续比较;如果比j大则swap进行交换;接着将基准值key与i比较,如果比i大则i++继续比较;如果比i小则swap进行交换,直到i=j位置,第一次比较结束;然后递归将分开的两段进行比较,这样就可以排好序了。 时间复杂度:理想为O(nl
第六章 编程题
sl1130398099的博客
10-31 249
import java.util.Arrays; import java.util.Scanner; public class lian6_1 { public static void main(String[] args) { int[] numbers=new int[0]; int[] counts=new int[0]; Scanner scanner=new Scann...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • SLF4J: Failed to load class的问题及解决 95952
  • 相关系数r和决定系数R2的那些事 95249
  • LaTex如何输入数集符合(整数集、实数集、复数集) 85311
  • Numpy中找出array中最大值所对应的行和列 78567
  • Numpy中如何给矩阵增加一行或一列 76796

分类专栏

  • Leetcode习题解析 97篇
  • 机器学习笔记 13篇
  • GIS 70篇
  • Python空间数据处理实战 28篇
  • Python 48篇
  • Java 47篇
  • 设计模式学习笔记 19篇
  • JavaFX 6篇
  • Servlet/JSP 7篇
  • C++ 49篇
  • 算法与数据结构 33篇
  • 基本排序算法 9篇
  • 数学(概念与方法) 25篇
  • 数字图像处理 10篇
  • 其它 45篇
  • C# 17篇
  • JavaScript 5篇
  • 计算机日常使用 40篇
  • 数据库 25篇
  • Android 2篇

最新评论

  • C++中的万能引用和完美转发

    SovietPower: 此外引用折叠中,没有 左值-左值 T& &、左值-右值 T& &&、右值-右值 T&& && 这三种情况,因为在推导模板实参 T 时,一般推导出的 T 都是不带引用的 int,除非形参是到无 cv 限定 T 的右值引用,即万能引用 T&&,此时如果实参是左值,则 T 才能是 int&。 并且结果是看实参是左值还是右值,而非是左值引用还是右值引用。也没有“右值引用类型变为了左值”这种说法,只是因为 变量名字构成的表达式 是左值表达式,所以它是左值表达式

  • C++中的万能引用和完美转发

    SovietPower: 博主其实还没理解什么是左值和右值。左右值是表达式的值类别,左值引用和右值引用是一种类型,值类别和类型是表达式的不同且无关的属性。 std::move不是将左值引用转为右值引用,而是将左值转为亡值,从而能调用移动构造。调用移动构造不是因为接收了右值引用,而是因为接收了右值(C++17 起只能是亡值)。 并且左值不是变量,右值也不是临时对象,它们是表达式的特征,只是左值和亡值会指代一个对象,而纯右值指代一个临时对象。并且在C++17后,纯右值不再指代临时对象,只是能发生临时量实质化转为亡值,此时才是一个对象。这也是能进行复制消除的原因

  • PostGIS批量导入栅格数据

    ZVM_hanchan: 感谢,研究了2小时,可算是把代码走通了

  • Windows字体美化指南

    电脑小玩家: 分享已经失效了,能再分享一下吗?谢谢了

  • 内点法

    向你步近 ✨: 案例里面内惩罚函数不应该是ln(8-x1-x2)吗

最新文章

  • 关于C++函数返回值的拷贝优化问题
  • 使用JDB调试Java程序
  • Windows下CLion中文乱码问题解决
2023年2篇
2022年6篇
2021年2篇
2020年17篇
2019年22篇
2018年46篇
2017年41篇
2016年49篇
2015年204篇
2014年93篇
2013年7篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳SEO优化公司永新SEO按天收费淮南建网站推荐长春优化郴州网站优化按天收费公司梧州网站搜索优化哪家好吉安seo推荐威海网站搭建推荐韶关优秀网站设计价格延边百度竞价报价布吉网站改版推荐温州百度网站优化排名公司亳州关键词按天收费公司六安营销型网站建设多少钱大浪网站排名优化报价吉林优秀网站设计报价定西建设网站报价株洲优秀网站设计推荐大运seo网站推广广东高端网站设计多少钱大连阿里店铺运营推荐林芝SEO按天收费公司南阳建网站哪家好德宏网站开发报价南宁外贸网站制作公司安顺至尊标王哪家好昭通建设网站荆州网络营销推荐绥化SEO按天计费多少钱长沙网站关键词优化安庆网站开发报价歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化