java基础算法-快速排序
玩博客园很多年,第一次写点什么,就从基础开始吧。最近去面试,发现自己算法忘光了,赶紧复习下。以下代码自带测试类,复制进eclipse中右键 run as --》java application 即可。控制台清晰打印出快排的过程。
package test; /**
*
* 排序算法测试类
*
*/
public class TestForSort { /**
* @param args
*/
public static void main(String[] args) {
int[] array = new int[] {4,1,5,3,2,6};
//快排
quicksort(array,0,array.length-1);
System.out.println("=======最终=========");
for(int a:array){
System.out.print(a);
}
} /**
* 快速排序
*
* @param int n[] 要排序的数组
* @param left 排序开始下标
* @param right 排序结束下标
* @return
*/
static void quicksort(int n[], int left, int right) {
int dp;
if (left < right) {
dp = partition(n, left, right);//分治法,返回中轴下标
quicksort(n, left, dp - 1);//左边递归快排
quicksort(n, dp + 1, right);//右边递归快排
}
} /**
* 快排核心算法,并返回中轴下标
* @param n 要分治的数组
* @param left 首位下标
* @param right 末位下标
* @return
*/
static int partition(int n[], int left, int right) { //数组的第一个作为中轴(顺道保留了左值)
int pivot = n[left];
System.out.println("==================排序前====================");
System.out.println("中轴值="+pivot);
System.out.println("=======每次分治========= ,left="+left+",n[left]="+n[left]+",right="+right+",n[right]="+right+"");
//左<右才执行,即为一直到i=j时为止,此时ij碰撞的位置就是中轴
while (left < right) {
//找到第一个比中轴小的数n[rigth]
while (left < right && n[right] >= pivot){
right--;
}
//把第一个比中轴小的输n[right]赋值给n[left],然后left右移一位
if (left < right){
System.out.println("把n["+right+"]赋值给n["+left+"],left右移一位");
n[left++] = n[right];
}
//找到第一个比中轴大的数n[left]
while (left < right && n[left] <= pivot){
left++;
}
//把第一个比中轴大的数n[left]赋值给n[right],并right左移一位
if (left < right){
System.out.println("把n["+left+"]赋值给n["+right+"],right右移一位");
n[right--] = n[left];
}
}
//中轴赋值给最终左值(下一个递归的中轴下标)
n[left] = pivot;
System.out.println("==================排序后====================");
System.out.println("中轴值="+pivot+"下标="+left);
System.out.println("left="+left+",n[left]="+n[left]+",right="+right+",n[right]="+right+""); for(int a:n){
System.out.print(a);
}
System.out.println();
//返回中轴下标
return left; }
}
java基础算法-快速排序的更多相关文章
- Java基础算法集50题
最近因为要准备实习,还有一个蓝桥杯的编程比赛,所以准备加强一下算法这块,然后百度了一下java基础算法,看到的都是那50套题,那就花了差不多三个晚自习的时间吧,大体看了一遍,做了其中的27道题,有一些 ...
- Java基础算法
i++;++i; i--;--i; int a=5;int b=a++;++放在后面,表示先使用a的值,a再加1b=5,a=a+1,a=6 int c=5;int d=++c;++放在前面,表示先将c ...
- java基础算法之快速排序
快速排序(Quicksort)是对冒泡排序的一种改进.在大学学过之后现在基本忘了,最近在好多地方都看到说快速排序在面试会问到,于是自己也准备重新拾起以前忘记的东西来,慢慢的积累自己的基础知识.figh ...
- java基础算法之冒泡排序
接触冒泡算法还是大一了,学习C语言的冒泡算法.现在唯一记得就是冒泡与选择了.出来刚刚工作的时候觉的算法基本没撒用处,现在发现这些都是很好的基础.因此自己也准备重新拾起这些知识. 冒泡排序 泡排序是一种 ...
- Java基础(49):快速排序的Java封装(含原理,完整可运行,结合VisualGo网站更好理解)
快速排序 对冒泡排序的一种改进,若初始记录序列按关键字有序或基本有序,蜕化为冒泡排序.使用的是递归原理,在所有同数量级O(n longn) 的排序方法中,其平均性能最好.就平均时间而言,是目前被认为最 ...
- java基础算法题
为了提高自己的代码能力和算法能力,我决定每天学习一道算法题,吸收前辈思想. [程序1] TestRabbit.java 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三 ...
- java基础算法之插入排序
一.插入排序介绍 插入排序(Insertion Sort)是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上,通 ...
- java基础算法之选择排序
选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完. ...
- Java排序算法——快速排序
import java.util.Arrays; //================================================= // File Name : Arrays_Q ...
随机推荐
- 【BZOJ1426】收集邮票 期望
[BZOJ1426]收集邮票 Description 有n种不同的邮票,皮皮想收集所有种类的邮票.唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是n种邮票中的哪一种是等概率的, ...
- 只有火狐识别的css
写在css里写只有火狐可以识别,其他浏览器不行. 就算写在@media only screen and (min-width: 960px) and (max-width: 1200px){ 里面也行 ...
- ACM Binary String Matching
Binary String Matching 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 Given two strings A and B, whose alp ...
- cdoj 1328 卿学姐与诡异村庄 Label:并查集 || 二分图染色
卿学姐与诡异村庄 Time Limit: 4500/1500MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...
- Flex弹性布局在移动设备上的应用
引文 首先,我们有表格布局.当不考虑语义并且利用一些适当的嵌套和其他技巧,我们可以用table建立具有一定功能的布局. 然后是现在大多数人都在使用的浮动布局.我们可以使用任何我们想用的元素,但浮动并不 ...
- spring源码学习之路---IOC容器初始化要义之bean定义载入(五)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 最近工作很忙,时间不多,研究 ...
- 史上最全的Win8快捷键大全
下列的 Win8 快捷键列表汇总均收集自网络,未全部实测,也有可能有Win7时代的热键混迹其中,不管怎样,如有错漏,欢迎大家指正! Win8 常用快捷键: Win键 可在开始屏幕主菜单及最后一个应用程 ...
- session/SessionFactory线程非安全和线程安全
SessionFactory负责创建session,SessionFactory是线程安全的,多个并发线程可以同时访问一个 SessionFactory 并从中获取Session实例. (Sessio ...
- iBatis in 语句参数传入方法
刚刚开始在工作中用到iBatis 在用到in去查询或者删除 我本来是传递一个String的参数,但是总是报以下的错误
- 不同版本strtotime("2016-09-04")输出不同问题
在php版本改变后,突然发现查询没结果.然后发现是时间不同了,测试以后发现以前版本的php和现在版本的phpstrtotime输出不同.原来是时区配置问题,解决办法:http://zhidao.bai ...