快排算法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 ...
随机推荐
- 从ArcGIS连接Oracle数据库,并将Oracle数据库注册到ArcGIS Server
环境说明 客户端机器环境: ① Win7 SP1 64位 ② ArcGIS Desktop 10.2 32位 ③ ArcGIS Server 10.2 64位 服务器环境 ① Windows Serv ...
- 将python工程部署到新服务器(对virtualenv工具进行环境迁移)
将python工程部署到新服务器(对virtualenv工具进行环境迁移) # 从开发的电脑上导出 pip list 到 requirements.txt 文件pip freeze > requ ...
- js中常见的字符串方法(3)
match() match()方法只接受一个参数,要么是一个正则表达式,要么是一个 RegExp 对象. 调用这个方法本质上与调用RegExp的exec()方法相同, var text = " ...
- go标准库I/O模型:epoll+多协程
本文为linux环境下的总结,其他操作系统本质差别不大.本地文件I/O和网络I/O逻辑类似. epoll+多线程的模型 epoll+多线程模型和epoll 单进程区别.优点 对比于redis这 ...
- Java8 集合相关操作
// java8 集合快速转成string List<String> cities; String citiesCommaSeparated = String.join(",&q ...
- Spring整合Hibernate的两种方式
在使用spring注解整合hibernate时出现"org.hibernate.MappingException: Unknown entity: com.ssh.entry.Product ...
- liunx下Oracle安装
1. 引言 将近一个月没有更新博客了,最近忙着数据库数据迁移工作:自己在服务器上搭建了oracle数据库,一步步走下来遇见很多BUG:现在自己记录下,方便以后有用上的地方: 2. 准备工作 oracl ...
- C# 练习题 将一个正整数分解质因数
题目:将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5.程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:(1)如果这个质数恰等于n,则说明分解质因数的过程 ...
- Win10家庭版升级到企业版的方法
一.家庭版升级企业版 1.右键单击[此电脑]——>属性 2.点击更改产品密钥 3.输入密钥:NPPR9-FWDCX-D2C8J-H872K-2YT43 4.点击下一步,验证结束后点击开始升级,然 ...
- dump net core windbg 内存分析
!dumpheap -stat //检查当前所有托管类型的统计信息 0:000> !dumpheap -stat //检查当前所有托管类型的统计信息 .... 00007ffdb9387a98 ...