iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >Java 七大排序之快速排序(三种方法包含优化方法)
  • 951
分享到

Java 七大排序之快速排序(三种方法包含优化方法)

java排序算法数据结构算法 2023-09-07 09:09:35 951人浏览 独家记忆
摘要

(1)基本思想 任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。 (2)代码实现

(1)基本思想

任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。

(2)代码实现

1)  挖坑法

划分完之后,再左右递归。当遇到array[right] >= tmp ,交换 array[left] 和 array[right] ;

 以此类推,最终得到正确排序。 

 public static int partition(int[] array,int left,int right){        int tmp =array[left];        while (left < right) {            while (left < right && array[right] >= tmp){                right--;            }            array[left] = array[right];            while (left < right && array[left] <= tmp){                left++;            }            array[right] = array[left];        }        array[left] = tmp;        return left;    }    public static void quickSort(int[] array) {        quick(array,0,array.length-1);    }    public static void quick(int[] array,int start,int end) {        if (start >= end) {            return;        }        //先划分,再左右递归        int pivot = partition(array,start,end);        quick(array,start,pivot-1);        quick(array,pivot+1,end);    }

2)Hoare法

当 right 找到比基准小的 ,left 找到比基准大的时 交换它们的值。

public static int partition2(int[] array,int left,int right){        int tmp =array[left];        int i = left;        while (left < right) {            while (left < right && array[right] >= tmp){                right--;            }            while (left < right && array[left] <= tmp){                left++;            }            swap(array,left,right);        }        //相遇之后        swap(array,left,i);        return left; }

swap 方法为交换方法,在我前面的文章中写过,这里就不写了,有需要的可以翻一下上一篇文章。

3)前后指针法(了解即可)

写法1:

private static int partition(int[] array, int left, int right) {int prev = left ;int cur = left+1;while (cur <= right) {if(array[cur] < array[left] && array[++prev] != array[cur]) {swap(array,cur,prev);}cur++;}swap(array,prev,left);return prev;}

写法2:

private static int partition(int[] array, int left, int right) {int d = left + 1;int pivot = array[left];for (int i = left + 1; i <= right; i++) {if (array[i] < pivot) {swap(array, i, d);d++;}}swap(array, d - 1, left);return d - 1;}

4)非递归实现快速排序

public static void quickSort(int[] array) {        Deque stack = new LinkedList<>();        int left = 0;        int right = array.length-1;        int pivot = partition(array,left,right);        if (pivot > left+1) {            stack.push(left);            stack.push(pivot-1);        }        if (pivot < right-1) {            stack.push(pivot+1);            stack.push(right);        }        while (!stack.isEmpty()) {            right = stack.pop();            left = stack.pop();            pivot = partition(array,left,right);            if (pivot > left+1) {                stack.push(left);                stack.push(pivot-1);            }            if (pivot < right-1) {                stack.push(pivot+1);                stack.push(right);            }        }    }

(3)特性总结

快速排序整体的综合性能和使用场景都是比较好;

时间复杂度:O(N*logN) 空间复杂度:O(logN);

稳定性:不稳定。

(4)快速排序的优化

当需要排序的元素太多,我们这时选取基准就非常重要了,因此我们采取三数取中法来选取合适的基准。

三数取中法:在三个数当中选出既不是最大的也不是最小的。

private static int midTree(int[] array,int left,int right) {        int mid = (left+right)/2;        if (array[left] < array[right]) {            if (array[mid] < array[left]) {                return left;            } else if(array[mid] > array[right]) {                return right;            } else {                return mid;            }        } else {            if (array[mid] < array[right]) {                return right;            } else if(array[mid] > array[left]) {                return left;            } else {                return mid;            }        }    }

如果遇到什么问题欢迎在评论区补充哦!

来源地址:https://blog.csdn.net/m0_56911648/article/details/130856402

--结束END--

本文标题: Java 七大排序之快速排序(三种方法包含优化方法)

本文链接: https://www.lsjlt.com/news/397936.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java 七大排序之快速排序(三种方法包含优化方法)
    (1)基本思想 任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。 (2)代码实现...
    99+
    2023-09-07
    java 排序算法 数据结构 算法
  • java 排序算法之快速排序
    目录简单介绍基本思想思路分析代码实现推导实现完整实现大数据量耗时测试性能分析简单介绍 快速排序(Quicksort) 是对 冒泡排序的一种改进。 基本思想 快速排序算法通过多次比较和...
    99+
    2024-04-02
  • JAVA十大排序算法之快速排序详解
    目录快速排序问题思路荷兰国旗问题代码实现时间复杂度算法稳定性总结快速排序 快速排序是对冒泡排序的一种改进,也是采用分治法的一个典型的应用。JDK中Arrays的sort()方法,具体...
    99+
    2024-04-02
  • 图解Java排序算法之快速排序的三数取中法
    目录基本步骤三数取中根据枢纽值进行分割代码实现总结基本步骤 三数取中 在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。在此我们采用三数取中法,也就是...
    99+
    2024-04-02
  • 六大排序算法(Java版):从插入排序到快速排序(含图解)
    目录 插入排序 (Insertion Sort) 直接插入排序的特性总结: 选择排序 (Selection Sort) 直接选择排序的特性总结 冒泡排序 (Bubble Sort)  冒泡排序的特性总结 堆排序(Heap Sort) 堆排序...
    99+
    2023-09-15
    排序算法 算法 数据结构 java 后端
  • Java排序算法之怎么实现快速排序的三数取中法
    这篇文章主要讲解了“Java排序算法之怎么实现快速排序的三数取中法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java排序算法之怎么实现快速排序的三数取中法”吧!基本步骤三数取中在快排的过...
    99+
    2023-06-25
  • Java快速排序方法怎么使用
    本篇内容介绍了“Java快速排序方法怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!快速排序思想介绍快速排序使用了分治的思想,通过一轮...
    99+
    2023-06-02
  • 排序算法图解之Java冒泡排序及优化
    目录1.冒泡排序简介2.图解算法3.冒泡排序代码实现4.冒泡排序算法的优化1.冒泡排序简介 冒泡排序(Bubble Sorting)即:通过对待排序的序列从前往后,依次比较相邻元素的...
    99+
    2022-11-13
    Java冒泡排序 Java 排序
  • C++归并法+快速排序实现链表排序的方法
    本文主要介绍了C++归并法+快速排序实现链表排序的方法,分享给大家,具体如下: 我们可以试用归并排序解决: 对链表归并排序的过程如下。 找到链表的中点,以中点为分界,将链表拆分成...
    99+
    2024-04-02
  • 排序算法图解之Java快速排序的分步刨析
    目录1.快速排序简介2.思路简介及图解3.实现代码及运行结果1.快速排序简介 快速排序是对冒泡排序的一种改进。基本思想为:通过一趟排序将要排序的数据分割为独立的两个部分,其中一部分的...
    99+
    2022-11-13
    Java快速排序算法 Java快速排序 Java 排序
  • 详解C语言快速排序三种方法的单趟实现
    目录交换排序的思想冒泡排序的思想快速排序的整体框架快速排序单趟实现逻辑1. hoare版本单趟实现(左右指针法)2.挖坑法单趟排序实现3.前后指针法交换排序的思想 基本思想:所谓交换...
    99+
    2024-04-02
  • Python排序算法之插入排序及其优化方案详解
    一、插入排序 插入排序与我们平时打扑克牌非常相似,将新摸到的牌插入到已有的牌中合适的位置,而已有的牌往往是有序的。 1.1 执行流程 (1)在执行过程中,插入排序会将序列分为2部...
    99+
    2024-04-02
  • Java中List排序的三种实现方法实例
    目录前言1.使用 Comparable 排序2.使用 Comparator 排序2.1 新建 Comparator 比较器2.2 匿名类比较器3.使用 Stream 流排序总结前言 ...
    99+
    2024-04-02
  • 怎么实现及优化快速排序算法
    本篇内容主要讲解“怎么实现及优化快速排序算法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么实现及优化快速排序算法”吧!前言快速排序可以说是使用最广的排序算法...
    99+
    2024-04-02
  • golang快速排序的方法是什么
    Golang中实现快速排序的方法如下: package main import "fmt" func mai...
    99+
    2024-02-29
    golang
  • Java中List排序的3种方法
    在某些特殊的场景下,我们需要在 Java 程序中对 List 集合进行排序操作。比如从第三方接口中获取所有用户的列表,但列表默认是以用户编号从小到大进行排序的,而我们的系统需要按照用户的年龄从大到小进行排序,这个时候,我们就需要对 List...
    99+
    2023-08-31
    java list 开发语言
  • Java中快速排序的优化技巧:随机取样、三数取中和插入排序
    目录 快速排序基础 优化1:随机取样 优化2:三数取中 优化3:插入排序 总结: 快速排序(Quick Sort)是一种高效的排序算法,它的平均时间复杂度为O(n log n)。然而,在某些情况下,快速排序可能表现不佳,特别是在输入数据近...
    99+
    2023-09-14
    排序算法 数据结构 算法 java 后端
  • Java深入浅出理解快速排序以及优化方式
    可能经常看面经的同学都知道,面试所遇到的排序算法,快速排序占主要位置,热度只增不减啊,其次就是归并和堆排序。 其实以前写过一篇排序的文章,写的比较简单,只是轻描淡写。今天我再次重新拿...
    99+
    2024-04-02
  • 利用java如何实现一个快速排序方法
    本篇文章给大家分享的是有关利用java如何实现一个快速排序方法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。java 算法之快速排序实现代码摘要: 常用算法之一的快速排序算法的...
    99+
    2023-05-31
    java ava 快速排序
  • mysql排序优化的方法是什么
    MySQL排序优化的方法有以下几种: 索引优化:为排序的列创建索引,可以大幅提高排序的效率。可以考虑创建单列索引、组合索引或者覆...
    99+
    2024-04-09
    mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作