快速排序——Java代码实现
快速排序
1. 基本思想
快速排序是对冒泡排序的一种改进,采用分治法的思想,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序。
2. 排序流程
快速排序算法通过多次比较和交换来实现排序,以从小到大排序为例,其排序流程如下:
- 定义一个中值(一般是数组第一个元素),通过中值将数组分为两个部分
- 将小于等于中值的元素集中在数组左半部分,将大于等于中值的元素集中在数组右半部分
- 即数组的左半部分的值,均小于或等于中值,数组的右半部分的值,均大于或等于中值
- 此时,又可以将数组的左半部分作为一个新的数组,右半部分也作为一个新的数组,重复上述按中值将数组分为两个部分的过程
- 可以看出,此过程为递归过程,通过递归先将左半部分排好序,然后将右半部分排好序,即全数组都排好了序
3.排序步骤(图解)
下图只展示第一趟排序的过程,往下每一趟过程都重复此过程,只是数组的边界值发生变化
4.Java代码实现快速排序
4.1函数代码:
public static int[] quickSort(int arr[],int left,int right) {int pivot = arr[left];//轴值int i = left;//左下标int j = right;//右下标while (i < j) {//在右边找到一个比中值小或者相等的值while (i < j && arr[j] > pivot) {j--;}//在左边找到一个比中值大或者相等的值while (i < j && arr[i] < pivot) {i++;}//在i和j没有相遇时,如果 arr[i] == arr[j] 此时让i+1//即让arr[i+1] 与arr[j]进行交换 ,使两个相同的数在一起if (arr[i] == arr[j] && i < j) {i++;} else {//交换int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}//左半部递归if (i-1 > left) {arr=quickSort(arr,left,i-1);}//右半部递归if (j+1 < right) {arr=quickSort(arr,j+1,right);}return arr;}
4.2测试:
测试用例:4,6,1,3,2,5 (与上图用例一致)
public class QuickSort {public static void main(String[] args) {int[] arr = {4,6,1,3,2,5};arr = quickSort(arr, 0, arr.length - 1);System.out.println("经过快速排序后的结果为:" + Arrays.toString(arr));}
}
测试结果:
5.算法分析
- 时间复杂度
- 最差:O(N^2),退化为冒泡排序
- 最优:O(NlogN)
- 平均:O(NlogN)
- 空间复杂度
- 递归调用消耗栈空间,因此为O(logN)
- 快排是一个不稳定的排序算法
- 33 33* 排序之后可能会变成 33* 33,即快速排序无法保证相等的元素的相对位置不变
快速排序——Java代码实现相关推荐
- 快速排序java代码_8 种排序算法与 Java 代码实现!
1.直接插入排序 经常碰到这样一类排序问题:把新的数据插入到已经排好的数据列中. 将第一个数和第二个数排序,然后构成一个有序序列 将第三个数插入进去,构成一个新的有序序列. 对第四个数.第五个数--直 ...
- 快速排序 java代码_java实现快速排序
一:快速排序的特征 1:冒泡排序的改进 2:内部交换数据 3:分治+递归的思想 4:稳定排序 5:时间复杂度为:O(n*logn) 二:算法的整体思路 1:原始数据:12 11 6 87 23 8 5 ...
- 快速排序Java代码实现
代码实现(附注释) import java.util.Arrays;public class Main {public static void main(String[] args) {int[] a ...
- 冒泡排序、快速排序 java代码实现
文章目录 冒泡排序 源码实现 单元测试 优化 快速排序 源码实现 单元测试 冒泡排序 源码实现 package csdn.dreamzuora.sort;import java.util.List;/ ...
- java冒泡从大到小排序代码_Java 冒泡排序、快速排序实例代码
冒泡排序 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地 进行直到没有再需要交换,也就是说该数列已经排序完成.这 ...
- Java实现快速排序详细代码
Java代码实现 /****@author g0rez*@data 2021-05-19**/ public class 快速排序 {public static void main(String[] ...
- 买什么数据结构与算法,这里有:动态图解十大经典排序算法(含JAVA代码实现)
上篇的动图数据结构反响不错,这次来个动图排序算法大全.数据结构与算法,齐了. 几张动态图捋清Java常用数据结构及其设计原理 本文将采取动态图+文字描述+正确的java代码实现来讲解以下十大排序算法: ...
- java array 元素的位置_数据结构与算法:动态图解十大经典排序算法(含JAVA代码实现)...
点击上方"JAVA",星标公众号 重磅干货,第一时间送达 本文将采取动态图+文字描述+正确的java代码实现来讲解以下十大排序算法: 冒泡排序 选择排序 插入排序 希尔排序 归并排 ...
- java代码_Java 代码实现排序算法
阅读本文约需要8分钟 大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了下SpringBoot+Gradle+ MyBa ...
最新文章
- Htc Vive VR 手势识别插件教程 1.1 版本(附1.0版本教程PDF)
- 中国SaaS死或生之四:卧榻之侧,是谁在捅刀 SaaS?
- python消息推送_Python阿里云消息推送调用API
- jupyter ipython display_Tensorflow从jupyter / Ipython运行动画
- 收集100条实用的网络知识
- php里面的mark,PHP CommonMarkCQL 用法 手册 | 示例代码
- python中的self含义及使用方法
- 开启php缩略图,PHP生成缩略图
- android包结构规范,【Android】Android产品-开发规范
- 代码整洁之道(二)优雅注释之道
- java 内存情况_Java代码中获取运行时内存情况
- 【专家专栏】浅谈百度搜索排序
- stm32F407 调试 LAN8720A ping不通问题解决
- snakeyaml操作yml文件中注释的处理
- 【从零开始学习Go语言】一.初识Go语言
- 通过高德api获取经纬度
- 华视电子web读取身份证信息
- 免费版软件文档文件格式转换
- 巨噬细胞膜包覆的负载二氧化锰MnO2和顺铂Pt的仿生纳米粒(齐岳)
- Mixly for Arduino(图形化编程工具) Mac安装