java 实现快速排序
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 实现快速排序相关推荐
- java实现快速排序算法
排序算法传送: 排序算法--java实现冒泡排序 排序算法--java实现选择排序 排序算法--java实现直接插入排序 排序算法--java实现二分法排序 排序算法--java实现希尔排序 排序算法 ...
- JAVA实现-快速排序
JAVA实现-快速排序 高快省的排序算法 有没有既不浪费空间又可以快一点的排序算法呢?那就是"快速排序"啦!光听这个名字是不是就觉得很高端呢. 假设我们现在对"6 1 2 ...
- 使用 Java 实现快速排序(详解)
一.概述 最近在看一些面试题,发现很多面试过程中都会要求手写快速排序,查阅一些博客发现别人写的并不是特别清楚而且也很难记住,所以为了更好的掌握这个算法,所以在这篇文章中,将自己的学习过程记录下来,你将 ...
- java nodelist 快速排序,【Leetcode】Sort List in java,你绝对想不到我是怎么做的^^我写完过了我自己都觉得好jian~...
Sort a linked list inO(nlogn) time using constant space complexity. 大家看完题目估计跟我一样啦...都在想哪些是nlogn啊~快速排 ...
- java里面快速排序_Java:快速排序
快速排序相当于冒泡排序的进化版本,优点是速度比冒泡排序更快,缺点是写起来逻辑比冒泡排序啰嗦一点,没那么直观. 快速排序之所以比较快,是因为相比冒泡排序,每次交换是跳跃式的.每次排序的时候 设置一个基准 ...
- Java实现快速排序 Quick Sort
本文带来八大排序算法之快速排序算法. 快速排序(QuickSort)是对冒泡排序的一种改进.基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小, ...
- Java【快速排序、插入排序、简单选择排序...】【八大排序-综合实验】
目 录 1.快速排序 1.1.概念+举例 1.2.完整代码 2.插入排序 2.1.概念+举例 2.2.完整代码 3.简单选择排序 3.1.概念+举例 3.2.完整代码 4.3种排序-综合代码 4. ...
- 分治法在排序算法中的应用(JAVA)--快速排序(Lomuto划分、Hoare划分、随机化快排)
分治法在排序算法中的应用--快速排序 时间复杂度:平均O(nlogn),最坏O(n^2) 如果说归并排序是按照元素在数组中的位置划分的话,那么快速排序就是按照元素的值进行划分.划分方法由两种,本节将主 ...
- JAVA简单快速排序讲解
首先,我们来了解一下什么是快速排序: 所谓快速排序,就是在冒泡排序的基础上进行改进,延伸出来的一种跳跃性的排序方法,我们都知道,冒泡排序,就是相邻两个数之间进行比较,然后根据情况(从小到大,从大到小) ...
- java版快速排序详解
package day04; /*** 关于快速排序的理解* 快速排序本质上通过一个数组划分为两个子数组,然后递归地调用自身为每一个子数组进行快速排序来实现的,即算法分为三步:* * 1.首先从数组中 ...
最新文章
- ListView 与 ImageList
- 使用NLog实现一个简单的日志记录(包含源代码)
- PostgreSQL示例demo
- dabs是什么意思_cpdd是什么意思(网络语cpdd是什么梗啥意思)
- ubutun 更换网络源_「ubuntu脚本1」开启ssh替换第三方源开启tab键补齐屏蔽nouveau
- linux 移动一行到指定行,linux – 移动行以跟随文件中的另一行
- Vue打包发布项目---vue工作笔记0020
- 用完HttpWebResponse时别忘了调用Close方法
- macOS Big Sur M1机型,如何正确完成软件的系统扩展设置?
- 【病毒分析】——熊猫烧香 专杀工具C源码
- Unity游戏ugui适配阿拉伯文本显示
- 各省份国内、入境旅游人数 (2007-2018年)
- Windows右键菜单管理 图片右键菜单太长
- 计算机那个是固态硬盘,固态硬盘的好处是什么?电脑使用固态硬盘有什么用
- Python:打印星号
- 信用修复的社会意义及基本概念、要素?
- Guava 之 Splitter
- Qt水波进度条Demo
- 证件照分辨率350dpi怎么调?怎么调照片dpi?
- 救生艇(Java算法每日一题)(双指针法)
热门文章
- RTOS实时操作系统
- 计算机专业知识试题二,计算机基础知识试题库及答案(2)
- mybatis-plus笔记(2)
- 干货! 快速上手typescript的学习笔记 (对比JS的新特性,环境搭建,webpack配置,ts编译配置)
- 聚合数据入选2021年江苏省大数据产业发展试点示范项目名单
- API与Ui集成新趋势下的RPA:海外厂商领先一步,国产厂商现状如何
- 解决vue项目在ie和360兼容模式下显示空白页问题
- [数学建模]最大最小化模型多目标规划问题
- Android内核编译(支持netfilter/iptalbes)(can't initialize iptables table `filter': iptables who)
- CMD快速进入指定目录