如题

手写一份快排算法.

注意, 两边双向找值的时候, 先从最右边起找严格小于基准值的值,再从最左边查找严格大于基准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. linux 资源

    linux 资源查看 cpu 信息 通过/proc/cpuinfo 查看  # 总核数 = 物理CPU个数 X 每颗物理CPU的核数  # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 ...

  2. php删除目录及目录下的内容

    今天遇到一个问题: java写的API,ppt转图片生成的目录和文件 在使用php调用API完成后,再使用php进行删除时,遇到了删除失败的问题 部署的环境是Ubuntu 导致删除失败的原因是权限的问 ...

  3. Java并发之等待/通知机制

    目录 1 前言 1.1 先来段代码放松一下 2 Object wait()/notify() 2.1 一段入门代码 2.2 问题三连击 a.为什么官方说wait() 要放在while里面? b.为什么 ...

  4. 头部文件jq嵌入笔记

    var headHtml = '<div class="container">' + '<div class="navbar-header"& ...

  5. JAVA知识点总结篇(三)

    抽象类 使用规则 abstract定义抽象类: abstract定义抽象方法,只有声明,不需要实现: 包含抽象方法的类是抽象类: 抽象类中可以包含普通方法,也可以没有抽象方法: 抽象类不能直接创建,可 ...

  6. NFS实现多服务器文件共享

    服务器 1.安装所需的软件包 yum install -y rpc-bind nfs-utils 2.设为开机自启动 systemctl enable nfs systemctl enable rpc ...

  7. Java之数据类型讲解

    Java数据类型关系图 基本数据类型 从小到大的关系图: 图中从左向右的转换都是隐式转换,无需再代码中进行强制转换 : byte i = 12; System.out.println("by ...

  8. 【已解决】ArcMap的界面如何恢复默认设置

    解决方案:在C盘内搜索“Normal.mxt”,将它删除,然后重启ArcMap,即可.  效果图:

  9. 【开发工具】- myeclipse安装主题

    你想用IDEA那样炫酷的符合90后气质的主题吗?废话不多说,按照下边步骤就可以安装像IDEA一样超级炫酷的主题. 下载主题 1.进入插件官网(http://eclipsecolorthemes.org ...

  10. 又一个js乱码的秘密alert放在js文件里中文乱码,可是放在HTML里显示中文就很好

    用文本文档打开你的js文件,文件-另存为,编码更改为UTF-8保存. 回复 | PFly | 园豆:94 (初学一级) | 2017-07-17 21:32 显示结果中文乱码 支持(0)反对(0)回复 ...