1.介绍

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

快速排序最好时间复杂度是O(n * log n),最坏时间复杂度是O(n*2) ,平均复杂度是O(n * log n)

对数log n :表示以2为底 n的对数

2.切分原理

切分原理: 把一个数组切分成两个子数组的基本思想:

1.找一个基准值,用两个指针分别指向数组的头部和尾部;

2.先从尾部向头部开始搜索一个比基准值小或等于的元素,搜索到即停止,并记录指针的位置;

3.再从头部向尾部开始搜索一个比基准值大或等于的元素,搜索到即停止,并记录指针的位置;

4.交换当前左边指针位置和右边指针位置的元素;

5.重复2,3,4步骤,直到左边指针的值大于右边指针的值停止。

代码实现

import java.time.Duration;
import java.time.LocalTime;public class QuickSort {public static void main(String[] args) {test1();
//      test2();}public static void test1() {
//      int arr[]= {-9,78,0,23,-567,70};int len = 12;int arr[]=new int [len];for(int i=0;i<len;i++) {arr[i]=(int) (Math.random()*100);}System.out.println("排序前的数组:");printArr(arr);quickSort(arr, 0, arr.length-1);System.out.println("排序后的数组:");printArr(arr);}//若干万数据,测试排序的时间public static void test2() {int len=80000;int arr[]=new int [len];for(int i=0;i<len;i++) {arr[i]=(int) (Math.random()*len);}LocalTime before=LocalTime.now();System.out.println("排序前的时间:"+before);quickSort(arr,0,len-1);LocalTime after=LocalTime.now();Duration duration=Duration.between(before, after);System.out.println("排序后的时间:"+after);System.out.println("时间差(毫秒):"+duration.toMillis());}private static void quickSort(int[] arr, int lo, int hi) {if(lo>=hi) return ;int partition=partition(arr,lo,hi);quickSort(arr,lo,partition-1);quickSort(arr,partition+1,hi);}private static int partition(int[] arr, int lo, int hi) {//把最左边的元素当作基准值int key=arr[lo];int left=lo; //int right=hi+1;while(true) {//左指针遇到>=key的值,才停下while(arr[++left] < key) {if(left==hi) break;}//右指针遇到<=key的值,才停下while(key < arr[--right]) {if(right==lo) break;}if(left>=right) {//扫描了所有元素,结束循环break;}else {//交换左右指针swap(arr,left,right);}}//right指向的值一定是小于或等于key值,所以交换key和右指针的值swap(arr,lo,right);return right;}/*** 交换数组两个元素* @param arr* @param i* @param j*/private static void swap(int[] arr, int i, int j) {int temp=arr[i];arr[i]=arr[j];arr[j]=temp;}private static void printArr(int[] arr) {for (int i : arr) {System.out.print(i+" ");}System.out.println();}
}

运行结果:

test1()

test2

快速排序的另一种实现

我认为这种写法更容易理解

public static void QuickSort(int []arr,int low,int high) {if(low<high) {int pivotpos=partition(arr,low,high);QuickSort(arr,low,pivotpos-1);QuickSort(arr,pivotpos+1,high);}}private static int partition(int[] arr, int low, int high) {int pivot=arr[low];while(low<high) {//起初,一定要从右边指针开始,因为arr[low]的值已经扔给了pivot,arr[low]//想象成无数字的空位while(low<high&&pivot<=arr[high]) {--high;}//把比pivot的小的数扔到左边指针//把arr[high]扔到arr[low]这个空位上//然后,high位置可以想象成无数字的空位arr[low]=arr[high];while(low<high&&arr[low]<=pivot) {++low;}//把比pivot大的数扔到右边//把arr[low]扔到arr[high]这个空位上//然后,low位置可以想象成是无数字的空位arr[high]=arr[low];}//此时low==high,return high也一样arr[low]=pivot;return low;}
}

java 实现快速排序相关推荐

  1. java实现快速排序算法

    排序算法传送: 排序算法--java实现冒泡排序 排序算法--java实现选择排序 排序算法--java实现直接插入排序 排序算法--java实现二分法排序 排序算法--java实现希尔排序 排序算法 ...

  2. JAVA实现-快速排序

    JAVA实现-快速排序 高快省的排序算法 有没有既不浪费空间又可以快一点的排序算法呢?那就是"快速排序"啦!光听这个名字是不是就觉得很高端呢. 假设我们现在对"6 1 2 ...

  3. 使用 Java 实现快速排序(详解)

    一.概述 最近在看一些面试题,发现很多面试过程中都会要求手写快速排序,查阅一些博客发现别人写的并不是特别清楚而且也很难记住,所以为了更好的掌握这个算法,所以在这篇文章中,将自己的学习过程记录下来,你将 ...

  4. java nodelist 快速排序,【Leetcode】Sort List in java,你绝对想不到我是怎么做的^^我写完过了我自己都觉得好jian~...

    Sort a linked list inO(nlogn) time using constant space complexity. 大家看完题目估计跟我一样啦...都在想哪些是nlogn啊~快速排 ...

  5. java里面快速排序_Java:快速排序

    快速排序相当于冒泡排序的进化版本,优点是速度比冒泡排序更快,缺点是写起来逻辑比冒泡排序啰嗦一点,没那么直观. 快速排序之所以比较快,是因为相比冒泡排序,每次交换是跳跃式的.每次排序的时候 设置一个基准 ...

  6. Java实现快速排序 Quick Sort

    本文带来八大排序算法之快速排序算法. 快速排序(QuickSort)是对冒泡排序的一种改进.基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小, ...

  7. Java【快速排序、插入排序、简单选择排序...】【八大排序-综合实验】

    目   录 1.快速排序 1.1.概念+举例 1.2.完整代码 2.插入排序 2.1.概念+举例 2.2.完整代码 3.简单选择排序 3.1.概念+举例 3.2.完整代码 4.3种排序-综合代码 4. ...

  8. 分治法在排序算法中的应用(JAVA)--快速排序(Lomuto划分、Hoare划分、随机化快排)

    分治法在排序算法中的应用--快速排序 时间复杂度:平均O(nlogn),最坏O(n^2) 如果说归并排序是按照元素在数组中的位置划分的话,那么快速排序就是按照元素的值进行划分.划分方法由两种,本节将主 ...

  9. JAVA简单快速排序讲解

    首先,我们来了解一下什么是快速排序: 所谓快速排序,就是在冒泡排序的基础上进行改进,延伸出来的一种跳跃性的排序方法,我们都知道,冒泡排序,就是相邻两个数之间进行比较,然后根据情况(从小到大,从大到小) ...

  10. java版快速排序详解

    package day04; /*** 关于快速排序的理解* 快速排序本质上通过一个数组划分为两个子数组,然后递归地调用自身为每一个子数组进行快速排序来实现的,即算法分为三步:* * 1.首先从数组中 ...

最新文章

  1. ListView 与 ImageList
  2. 使用NLog实现一个简单的日志记录(包含源代码)
  3. PostgreSQL示例demo
  4. dabs是什么意思_cpdd是什么意思(网络语cpdd是什么梗啥意思)
  5. ubutun 更换网络源_「ubuntu脚本1」开启ssh替换第三方源开启tab键补齐屏蔽nouveau
  6. linux 移动一行到指定行,linux – 移动行以跟随文件中的另一行
  7. Vue打包发布项目---vue工作笔记0020
  8. 用完HttpWebResponse时别忘了调用Close方法
  9. macOS Big Sur M1机型,如何正确完成软件的系统扩展设置?
  10. 【病毒分析】——熊猫烧香 专杀工具C源码
  11. Unity游戏ugui适配阿拉伯文本显示
  12. 各省份国内、入境旅游人数 (2007-2018年)
  13. Windows右键菜单管理 图片右键菜单太长
  14. 计算机那个是固态硬盘,固态硬盘的好处是什么?电脑使用固态硬盘有什么用
  15. Python:打印星号
  16. 信用修复的社会意义及基本概念、要素?
  17. Guava 之 Splitter
  18. Qt水波进度条Demo
  19. 证件照分辨率350dpi怎么调?怎么调照片dpi?
  20. 救生艇(Java算法每日一题)(双指针法)

热门文章

  1. RTOS实时操作系统
  2. 计算机专业知识试题二,计算机基础知识试题库及答案(2)
  3. mybatis-plus笔记(2)
  4. 干货! 快速上手typescript的学习笔记 (对比JS的新特性,环境搭建,webpack配置,ts编译配置)
  5. 聚合数据入选2021年江苏省大数据产业发展试点示范项目名单
  6. API与Ui集成新趋势下的RPA:海外厂商领先一步,国产厂商现状如何
  7. 解决vue项目在ie和360兼容模式下显示空白页问题
  8. [数学建模]最大最小化模型多目标规划问题
  9. Android内核编译(支持netfilter/iptalbes)(can't initialize iptables table `filter': iptables who)
  10. CMD快速进入指定目录