如题

手写一份快排算法.

注意, 两边双向找值的时候, 先从最右边起找严格小于基准值的值,再从最左边查找严格大于基准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的更多相关文章

  1. 快排的java实现方式,用java代码来实现快排

    1. 快排的思想 通过一趟排序将要排序的数据分割成独立的两部分,前一部分的所有数据都要小于后一部分的所有数据,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据的 ...

  2. 天天算法————快排及java实现。

    快排说的很邪乎,原理懂了,实现自然也就出来了: public void static quickSorted( int[] a ,int low ,int high){ //递归结束条件 if(low ...

  3. QuickSort(快排)的JAVA实现

    QuickSort的JAVA实现 这是一篇算法课程的复习笔记 用JAVA对快排又实现了一遍. 先实现的是那个easy版的,每次选的排序轴都是数组的最后一个: package com.algorithm ...

  4. 排序算法Java版,以及各自的复杂度,以及由堆排序产生的top K问题

    常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结 ...

  5. 常用排序算法--java版

    package com.whw.sortPractice; import java.util.Arrays; public class Sort { /** * 遍历一个数组 * @param sor ...

  6. 冒泡,快排算法之javascript初体验

    引子:javascript实际使用的排序算法在标准中没有定义,可能是冒泡或快排.不用数组原生的 sort() 方法来实现冒泡和快排. Part 1:冒泡排序(Bubble Sort) 原理:临近的两数 ...

  7. 排序算法系列:快速排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)

    在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 为了不误人子弟耽误时间,推荐看一些靠谱的资源,如[啊哈!算法]系列: https: ...

  8. 重学 Java 设计模式:实战中介者模式「按照Mybaits原理手写ORM框架,给JDBC方式操作数据库增加中介者场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 同龄人的差距是从什么时候拉开的 同样的幼儿园.同样的小学.一样 ...

  9. 快排算法(C++版)

    #include <iostream> using namespace std; /** Quick Sort * * split: cmp && swap * left ...

随机推荐

  1. Unable to create application 异常

      这个错误是空指针,但你怎么去找就是找不到为什么会空指针 这时,你要去检查Application 中是否有重写的方法例如这个 @Override protected void attachBaseC ...

  2. python中__init__.py的作用、module和package

    控制包的导入行为: 1.声明当前文件是一个可导入的包: 2.如果当下包下有多个.py文件使用__ all__ = [ '模块名'],也就是form XXX import YYY module和pack ...

  3. Java之static作用的深度总结

    1.深度总结 引用一位网友的话,说的非常好,如果别人问你static的作用:如果你说静态修饰 类的属性 和 类的方法 别人认为你是合格的:如果是说 可以构成 静态代码块,那别人认为你还可以: 如果你说 ...

  4. git最基本的操作: add commit push 哈哈

    Git add     //添加到本地暂存区 Git commit -m”xxxxx”   //添加到本地分支 Git push      //添加到远端分支

  5. [Docker] - 使用 Kitematic 安装 elasticsearch 失败 之解决

    环境:Docker v19.03.4 + Kitematic Issue:(HTTP code 404) no such image - no such image: elasticsearch:la ...

  6. mysql 启动 && 停止

    启动:service mysql start关闭:service mysql stop查进程:ps aux | grep mysql杀进程:kill -9 mysqlID Good Good Stud ...

  7. celery 分布式异步任务框架(celery简单使用、celery多任务结构、celery定时任务、celery计划任务、celery在Django项目中使用Python脚本调用Django环境)

    一.celery简介: Celery 是一个强大的 分布式任务队列 的 异步处理框架,它可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行.我们通常使用它来实现异步任务(async tas ...

  8. day48——css样式

    day48 通过调试窗口还可以玩一个神奇的东西 document.body.contentEditable=true css样式 高度宽度 width宽度 height高度 块级标签能设置高度宽度,内 ...

  9. 国际化地区语言码对照表(i18n)

    af 公用荷兰语 af-ZA 公用荷兰语 - 南非 sq 阿尔巴尼亚 sq-AL 阿尔巴尼亚 -阿尔巴尼亚 ar 阿拉伯语 ar-DZ 阿拉伯语 -阿尔及利亚 ar-BH 阿拉伯语 -巴林 ar-EG ...

  10. Linux 头文件详解

    概览: 头文件目录中总共有32个.h头文件.其中主目录下有13个,asm子目录中有4个,Linux子目录中有10个,sys子目录中有5个. <a.out.h>:a.out头文件,定义了a. ...