快排算法Java版-每次以最左边的值为基准值手写QuickSort
如题
手写一份快排算法.
注意, 两边双向找值的时候, 先从最右边起找严格小于基准值的值,再从最左边查找严格大于基准base的值; 并且先右后左的顺序不能反!!这个bug改了好久,233~
https://blog.csdn.net/shujuelin/article/details/82423852
部分内容借鉴了一下上面这篇博客,上面这篇博客还有啊哈算法原书的图解,很直观.
本文的其他作用就只有一个打印数组,实时显示排序效果的优势了;另外可以多测试几次,试着扩大数组范围看看自己写的排序效果~~
QuickSort类和QuickSort算法如下
package com.szs;
import java.util.Random;
/**
* 以最左边的值为基准值手写QuickSort
* @param args
*/
public class QuickSort {
/**
* 找到基准值,右左交换,分割,递归,结束递归
* @param array 数组
* @param left 左边界下标
* @param right 右边界下标
*/
public static void quickSort(int array[],int left,int right){
//判断合法
if(left>right){
return ;
}
//确定基准值base, 以最左边的为基准值
int base = array[left];
//左起的 >基准的值,右起<基准的值
int l=left,r=right;
while(l<r){
//先看右边,右起 查找小于基准base的值
while(array[r]>=base&&l<r)--r;
//再看左边,找到左起的大于基准base的值
while(array[l]<=base&&l<r)++l;
//如果满足条件则交换
if(l<r){
int temp=array[l];
array[l]=array[r];
array[r]=temp;
}
}
// l==r ,恒为真,可不加此判断
if(l==r){
//最后将基准值base为与l和r相等位置的数字交换
array[left] = array[l];
array[r] = base;
}
System.out.println("排序中--"+"此次排序范围["+left+","+right+"] "+",基准值base="+base+ " ,l="+l+" "+" ,r="+r);
print(array);
//左右递归
quickSort(array, left, l-1);
quickSort(array, r+1, right);
}
如下为main方法
/**
* main方法,生成10个随机数进行测试
* @param args
*/
public static void main(String[] args) {
//生成数组,
int array[]=new int[10];
for(int i=0;i<array.length;i++){
array[i] = new Random().nextInt() % 100;
}
//打印下标
printIndex(array);
System.out.println("排序前--");
print(array);
//排序
quickSort(array, 0, array.length-1);
System.out.println("quickSort排序后--");
print(array,l);
}
如下为print方法
/**
* 打印数组,以及判断是否升序
* @param array
*/
public static void print(int array[]){
for(int i=0;i<array.length;i++){
System.out.print("\t"+array[i]);
}
Boolean upOrder=true;
for(int i=0;i<array.length-1;i++){
if(array[i]>array[i+1]){
upOrder=false;
}
}
if(upOrder)System.out.println("\n\t"+"升序");
else System.out.println("\n\t"+"非升序");
}
/**
* 打印数组,将每次选取的基准值用[]标出来,以及判断是否升序
* @param array
* @param l
*/
public static void print(int array[],int l){
for(int i=0;i<array.length;i++){
if(i!=l)System.out.print("\t"+array[i]);
else System.out.print(" ["+array[i]+"]");
}
Boolean upOrder=true;
for(int i=0;i<array.length-1;i++){
if(array[i]>array[i+1]){
upOrder=false;
}
}
if(upOrder)System.out.println("\n\t"+"升序");
else System.out.println("\n\t"+"非升序");
}
/**
* 打印数组的下标
*/
public static void printIndex(int array[]){
System.out.print("打印下标 ");
for(int i=0;i<array.length;i++){
System.out.print("\t "+i);
}
System.out.println();
}
}
执行测试 , 此次数组长度为6

数组长度为10的话,打印出来可能太长了,大家可以自行调整为5或6,这样可以自己进行手算或者调试!

快排算法Java版-每次以最左边的值为基准值手写QuickSort的更多相关文章
- 快排的java实现方式,用java代码来实现快排
1. 快排的思想 通过一趟排序将要排序的数据分割成独立的两部分,前一部分的所有数据都要小于后一部分的所有数据,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据的 ...
- 天天算法————快排及java实现。
快排说的很邪乎,原理懂了,实现自然也就出来了: public void static quickSorted( int[] a ,int low ,int high){ //递归结束条件 if(low ...
- QuickSort(快排)的JAVA实现
QuickSort的JAVA实现 这是一篇算法课程的复习笔记 用JAVA对快排又实现了一遍. 先实现的是那个easy版的,每次选的排序轴都是数组的最后一个: package com.algorithm ...
- 排序算法Java版,以及各自的复杂度,以及由堆排序产生的top K问题
常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结 ...
- 常用排序算法--java版
package com.whw.sortPractice; import java.util.Arrays; public class Sort { /** * 遍历一个数组 * @param sor ...
- 冒泡,快排算法之javascript初体验
引子:javascript实际使用的排序算法在标准中没有定义,可能是冒泡或快排.不用数组原生的 sort() 方法来实现冒泡和快排. Part 1:冒泡排序(Bubble Sort) 原理:临近的两数 ...
- 排序算法系列:快速排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)
在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 为了不误人子弟耽误时间,推荐看一些靠谱的资源,如[啊哈!算法]系列: https: ...
- 重学 Java 设计模式:实战中介者模式「按照Mybaits原理手写ORM框架,给JDBC方式操作数据库增加中介者场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 同龄人的差距是从什么时候拉开的 同样的幼儿园.同样的小学.一样 ...
- 快排算法(C++版)
#include <iostream> using namespace std; /** Quick Sort * * split: cmp && swap * left ...
随机推荐
- Jeecg 支持多视图设置
<!-- 视图解析器1:html视图解析器 必须先配置freemarkerConfig,注意html是没有prefix前缀属性的 --> <bean id="freemar ...
- [分享会] 微服务框架设计 (基于Swoole)
框架三要素 1. Service 通信 2. 服务管理 3. 开发组件 为什么需要服务 1.自治性 2.可组合 3.异构性 2.弹性扩展 -实现方式- 共享库 1.二进制文件/Compos ...
- Java多线程看这一篇就足够了(吐血超详细总结)
进程与线程 进程是程序的一次动态执行过程,它需要经历从代码加载,代码执行到执行完毕的一个完整的过程,这个过程也是进程本身从产生,发展到最终消亡的过程.多进程操作系统能同时达运行多个进程(程序),由于 ...
- DIY:从零开始写一个 SQL 构建器
最近在项目中遇到了一个棘手的问题,因为 EF Core 不支持直接生成 Update 语句,所以这个项目就用到了 EFCore.Plus 来实现这个功能,但是 EFCore.Plus 对 SQLite ...
- linux_permission
linux命令与权限(permission denied):权限问题 a 上调权限 chmod 777 test.php b 更改为root su root 提示输入root密码 c root权 ...
- python的mysql数据库操作
python操作mysql数据库 Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口. Python 数据库接口支持非常多的数据库 ...
- Windows下同时安装了Python2与Python3时如何使用RobotFrameWork
由于windows下不能像linux那样指定python文件的运行路径,当电脑中即安装了python2,又安装了python3时,也不能在环境变量中都配置运行路径吧(当然是可以配置的,系统会按照靠前的 ...
- PyGSP
PyGSP # PyGSP (0.5.1) # matplotlib (3.1.2) # networkx (2.4) # numpy (1.17.4) from pygsp import graph ...
- [转帖]Beyond compare4密钥
Beyond compare4密钥 https://blog.csdn.net/lemontree1945/article/details/92963423 学习一下 最近想破解水卡.... w4G- ...
- .NET Core sdk和runtime区别
SDK和runtime区别 .net core Runtime[跑netcore 程序的] (CoreCLR) .net core SDK (开发工具包 [runtime(jre) + Rolysn( ...