玩博客园很多年,第一次写点什么,就从基础开始吧。最近去面试,发现自己算法忘光了,赶紧复习下。以下代码自带测试类,复制进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基础算法-快速排序的更多相关文章

  1. Java基础算法集50题

    最近因为要准备实习,还有一个蓝桥杯的编程比赛,所以准备加强一下算法这块,然后百度了一下java基础算法,看到的都是那50套题,那就花了差不多三个晚自习的时间吧,大体看了一遍,做了其中的27道题,有一些 ...

  2. 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 ...

  3. java基础算法之快速排序

    快速排序(Quicksort)是对冒泡排序的一种改进.在大学学过之后现在基本忘了,最近在好多地方都看到说快速排序在面试会问到,于是自己也准备重新拾起以前忘记的东西来,慢慢的积累自己的基础知识.figh ...

  4. java基础算法之冒泡排序

    接触冒泡算法还是大一了,学习C语言的冒泡算法.现在唯一记得就是冒泡与选择了.出来刚刚工作的时候觉的算法基本没撒用处,现在发现这些都是很好的基础.因此自己也准备重新拾起这些知识. 冒泡排序 泡排序是一种 ...

  5. Java基础(49):快速排序的Java封装(含原理,完整可运行,结合VisualGo网站更好理解)

    快速排序 对冒泡排序的一种改进,若初始记录序列按关键字有序或基本有序,蜕化为冒泡排序.使用的是递归原理,在所有同数量级O(n longn) 的排序方法中,其平均性能最好.就平均时间而言,是目前被认为最 ...

  6. java基础算法题

    为了提高自己的代码能力和算法能力,我决定每天学习一道算法题,吸收前辈思想. [程序1] TestRabbit.java 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三 ...

  7. java基础算法之插入排序

    一.插入排序介绍 插入排序(Insertion Sort)是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上,通 ...

  8. java基础算法之选择排序

    选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完. ...

  9. Java排序算法——快速排序

    import java.util.Arrays; //================================================= // File Name : Arrays_Q ...

随机推荐

  1. Javascript中括号“[]”的多义性

    摘要:本文就是主要是分享JavaScript中括号的四种语义. Javascript中括号有四种语义 语义1,声明数组 var ary = []; // 声明一个空数组 var ary = [1,3] ...

  2. android布局详解

      http://blog.163.com/zhangzheming_282/blog/static/117920962013072502787/   AbsoluteLayout——绝对布局   必 ...

  3. Codeforces Round #252 (Div. 2) B. Valera and Fruits

    #include <iostream> #include <vector> #include <algorithm> #include <map> us ...

  4. Install the Maven in your computer

    While, this blog will talk about installing the Maven in your computer. There are three steps as fol ...

  5. Excel中COUNTIFS函数统计词频个数出现次数

    Excel中COUNTIFS函数统计词频个数出现次数   在Excel中经常需要实现如下需求:在某一列单元格中有不同的词语,有些词语相同,有的不同(如图1所示).需要统计Excel表格中每个词语出现的 ...

  6. ffmpeg入门

    总入口 http://blog.csdn.net/leixiaohua1020/article/details/15811977 各结构体介绍 http://blog.csdn.net/leixiao ...

  7. linux ps指令

    ps axjf <==連同部分程序樹狀態

  8. mysql命令行参数(转)

    MySQL命令行参数 Usage: mysql [OPTIONS] [database] //命令方式  -?, --help //显示帮助信息并退出  -I, --help //显示帮助信息并退出  ...

  9. Oracle数据库合并行记录,WMSYS.WM_CONCAT 函數的用法

    Sql代码 select t.rank, t.Name from t_menu_item t; 10 CLARK    10 KING    10 MILLER    20 ADAMS    20 F ...

  10. 最长递增子序列 O(NlogN)算法

    转自:点击打开链接 最长递增子序列,Longest Increasing Subsequence 下面我们简记为 LIS. 排序+LCS算法 以及 DP算法就忽略了,这两个太容易理解了. 假设存在一个 ...