JAVA快速排序递归算法
快速排序
分为双边循环法和单边循环法,先来双边循环法,双边循环法是使用双指针,首先,选定基准元素pivot,并且设置两个指针left和right,指向数列的最左和最右两个元素。接下来进行第1次循环,从right指针开始,让指针所指向的元素和基准元素做比较。如果大于或等于pivot,则指针向左移动;如果小于pivot,则right指针停止移动,切换到left指针。轮到left指针行动,让指针所指向的元素和基准元素做比较。如果小于或等于pivot,则指针向右移动;如果大于pivot,则left指针停止移动。然后交换两个数据,完成一次循环,移动到重合时,让重合点和基准元素进行交换,完成一轮.
这是交换代码
private static int partition(int[] arr, int startIndex, int endIndex) {
// 取第一个位置的元素作为基准元素(也可以选择随机位置)
int pivot = arr[startIndex];
int left = startIndex;左指针
int right = endIndex;右指针while( left != right) {
//控制right指针比较并左移
while(left<right && arr[right] > pivot){
right--;
}
//控制left指针比较并右移
while( left<right && arr[left] <= pivot) {
left++;
}
//交换left和right指向的元素
if(left<right) {
int p = arr[left];
arr[left] = arr[right];
arr[right] = p;
}
}
//pivot和指针重合点交换
arr[startIndex] = arr[left];
arr[left] = pivot;
return left;
}
单边循环法,开始和双边循环法相似,首先选定基准元素pivot。同时,设置一个mark指针指向数列起始位置,这个mark指针代表小于基准元素的区域边界。
接下来,从基准元素的下一个位置开始遍历数组。如果遍历到的元素大于基准元素,就继续往后遍历。如果遍历到的元素小于基准元素,则需要做两件事:第一,把mark指针右移1位,因为小于pivot的区域边界增大了1;第二,让最新遍历到的元素和mark指针所在位置的元素交换位置,因为最新遍历的元素归属于小于pivot的区域。
这是交换代码
private static int partitionV2(int[] arr, int startIndex, int endIndex) {
// 取第一个位置的元素作为基准元素(也可以选择随机位置)
int pivot = arr[startIndex];
int mark = startIndex;for(int i=startIndex+1; i<=endIndex; i++){
if(arr[i]<pivot){
mark ++;
int p = arr[mark];
arr[mark] = arr[i];
arr[i] = p;
}
}
不管用哪种方法,递归的方法都是一样的
public static void quickSort(int[] arr, int startIndex, int endIndex) {
// 递归结束条件:startIndex大等于endIndex的时候
if (startIndex >= endIndex) {
return;
}
// 得到基准元素位置
int pivotIndex = partition(arr, startIndex, endIndex);
// 根据基准元素,分成两部分递归排序
quickSort(arr, startIndex, pivotIndex - 1);
quickSort(arr, pivotIndex + 1, endIndex);
}
看一下实现的总代码吧
package sort;import java.util.Arrays;public class Quicksort {public static void quickSort(int[] arr, int startIndex, int endIndex) {// 递归结束条件:startIndex大等于endIndex的时候if (startIndex >= endIndex) {return;}// 得到基准元素位置int pivotIndex = partition(arr, startIndex, endIndex);// 根据基准元素,分成两部分递归排序quickSort(arr, startIndex, pivotIndex - 1);quickSort(arr, pivotIndex + 1, endIndex);
}/*** 分治(双边循环法)* @param arr 待交换的数组* @param startIndex 起始下标* @param endIndex 结束下标*/private static int partition(int[] arr, int startIndex, int endIndex) {// 取第一个位置的元素作为基准元素(也可以选择随机位置)int pivot = arr[startIndex];int left = startIndex;int right = endIndex;while( left != right) {//控制right指针比较并左移while(left<right && arr[right] > pivot){right--;}//控制left指针比较并右移while( left<right && arr[left] <= pivot) {left++;}//交换left和right指向的元素if(left<right) {int p = arr[left];arr[left] = arr[right];arr[right] = p;}}//pivot和指针重合点交换arr[startIndex] = arr[left];arr[left] = pivot;return left;}/*** 分治(单边循环法)* @param arr 待交换的数组* @param startIndex 起始下标* @param endIndex 结束下标*/private static int partitionV2(int[] arr, int startIndex, int endIndex) {// 取第一个位置的元素作为基准元素(也可以选择随机位置)int pivot = arr[startIndex];int mark = startIndex;for(int i=startIndex+1; i<=endIndex; i++){if(arr[i]<pivot){mark ++;int p = arr[mark];arr[mark] = arr[i];arr[i] = p;}}arr[startIndex] = arr[mark];arr[mark] = pivot;return mark;}public static void main(String[] args) {int[] arr = new int[] {4,4,6,5,3,2,8,1};quickSort(arr, 0, arr.length-1);System.out.println(Arrays.toString(arr));}}
JAVA快速排序递归算法相关推荐
- java快速排序算法_JAVA版排序算法之快速排序示例
本文实例讲述了JAVA快速排序实现方法.分享给大家供大家参考,具体如下: package com.ethan.sort.java; import java.util.Arrays; import ja ...
- java实现递归算法_如何在Java中实现二进制搜索算法而无需递归
java实现递归算法 by javinpaul 由javinpaul 流行的二进制搜索算法的迭代实现,用于在排序数组中查找元素. (An Iterative implementation of the ...
- java 快速排序 递归_Java递归快速入门
java 快速排序 递归 The function calls itself until someone stops it. 该函数将自行调用,直到有人停止它为止. Recursion can fee ...
- JAVA快速排序算法实现
JAVA快速排序算法实现 private static void quickSort(int[] arr, int start, int end) {if(start < end) {int b ...
- Java 快速排序,递归排序算法
2.4 快速排序 递归算法:递归就是指方法中调用方法本身的现象. 递归注意事项:递归一定要有出口,否则会有栈内存溢出.出口就是要有停止递归的时候. 递归的两个核心 1.找出口 2.找规律 方法内部再次 ...
- 解读:什么是Java的递归算法?
Java可以说是使用率非常高的一门编程语言了,在21世纪的今天Java绝对可以说的上是最热门的行业了.Java行业也被誉为IT行业的中流砥柱,是运用范围最为广泛的语言.今天小千就来和大家聊聊什么是Ja ...
- XDOJ 363 输出快速排序递归算法隐含递归树的后序遍历序列 AC
像我这样的菜鸡也没有什么能输出的,好像我写题解也不算输出. 最近期末了,写数据结构实验的时候,这个题写了挺久的,搞出来记录一下. 输出快速排序递归算法隐含递归树的后序遍历序列 描述: 快速排序递归算法 ...
- JAVA——快速排序(详细)
JAVA快速排序的实现 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等 ...
- java快速排序,优化
java快速排序优化 研究java快速排序ing,目前希望做到,尽可能少的循环.交换.(求指点) (话说回来是判断连个值大小快,还是交换两个值快.我是凭感觉,认为判断连个大小快,所以当前版本判断比较多 ...
最新文章
- [转载] 七龙珠第一部——第004话 掳人的妖怪——乌龙
- JavaScript open() 函数
- ViewModelBase ObservableObject
- 网站福音 如何免费获得HTTPS认证服务?
- android触摸屏idc,Android触摸屏IDC
- 【jQuery Demo】图片由下至上逐渐显示
- selenium 定位方式2
- ❤️《小黄鸭调试法》程序员必备技能!!!❤️
- (转)IBM AIX系统安装
- 搭建开发环境之串口线的选择
- c语言考试题库大一下学期基础,c语言考试题(全国c语言二级考试题库)
- 时区相关-这一篇全了解
- 微信连wifi3.1总结
- 解决No thread-bound request found: Are you referring to request attributes outside of an actual web...
- Springboot整合liqubase
- 既然都有了NS,何不再入一个喷喷(Splatoon 2)【下】
- latex参考文献太长,换行处理
- 客制化键盘编程_客制化键盘QMK固件入门-修改keyboard和keymap
- 农业无人机的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- 率土之滨服务器进备战区维护多久,备战区完全解读