java基础算法-快速排序

玩博客园很多年,第一次写点什么,就从基础开始吧。最近去面试,发现自己算法忘光了,赶紧复习下。

/**

* 排序算法测试类
*
*/
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;

}
}

时间: 2024-10-05 02:58:51

java基础算法-快速排序的相关文章

java基础算法之排序

总体基础算法总结 http://blog.csdn.net/lilong_dream/article/details/23356513 基础算法之排序 http://www.cnblogs.com/qqzy168/archive/2013/08/03/3219201.html 基础算法之数组.字符串 String l="helloworld";toCharArray 将字符串转化成数组char[] a1=l.toCharArray(); toCharArray()  //获得字符串对应

java基础算法之快速排序

快速排序(Quicksort)是对冒泡排序的一种改进.在大学学过之后现在基本忘了,最近在好多地方都看到说快速排序在面试会问到,于是自己也准备重新拾起以前忘记的东西来,慢慢的积累自己的基础知识.fighting 算法概念 快速排序由C. A. R. Hoare在1962(50多年了呢)年提出,它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有

java基础算法--排序大全

1 package sorting; 2 3 import java.util.*; 4 //import java.util.Comparator; 5 //import java.util.PriorityQueue; 6 //import java.util.Queue; 7 8 public class Sorting { 9 /************************************序言******************************************

java基础算法之冒泡排序

接触冒泡算法还是大一了,学习C语言的冒泡算法.现在唯一记得就是冒泡与选择了.出来刚刚工作的时候觉的算法基本没撒用处,现在发现这些都是很好的基础.因此自己也准备重新拾起这些知识. 冒泡排序 泡排序是一种很简单的排序的算法,根据名字就可以知道这一个过程,一点点的把大的数移到顶部. 时间复杂度 若文件的初始状态是正序的,一趟扫描即可完成排序.所需的关键字比较次数 和记录移动次数 均达到最小值:  ,  .所以,冒泡排序最好的时间复杂度为 . 若初始文件是反序的,需要进行 趟排序.每趟排序要进行 次关键

java基础算法题

为了提高自己的代码能力和算法能力,我决定每天学习一道算法题,吸收前辈思想. [程序1] TestRabbit.java 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 程序分析:兔子数量的规律为数列:1,1,2,3,5,8,13.....其实就是斐波那契数列  使用递归就可以实现 1 /** 2 * 兔子问题 3 * 2016/5/9 4 * 斐波那契数列求值 5 *题目:古典问题:有一对兔子,

java基础算法之插入排序

一.插入排序介绍 插入排序(Insertion Sort)是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间.时间复杂度:O(n^2); 算法描述:     1.排序从第二个元素开始,第一个元素默认为有序的.     2.取出下一个元素(第一次取第二个,后面依

java基础算法之选择排序

选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完. 时间复杂度  选择排序的交换操作介于 0 和 (n - 1) 次之间.选择排序的比较操作为 n (n - 1) / 2 次之间.选择排序的赋值操作介于 0 和 3 (n - 1) 次之间.比较次数O(n^2),比较次数与关键字的初始状态无关,总的比较次数N=(n-1)+(n-2)+...+1=n*(

Java排序算法——快速排序

import java.util.Arrays; //================================================= // File Name : Arrays_Quick //------------------------------------------------------------------------------ // Author : Common //类名:Arrays_Quick //属性: //方法: class Arrays_Qu

php 四种基础算法 ---- 快速排序法

4.快速排序法 代码: function quick_sort($arr) {    //先判断是否需要继续进行    $length = count($arr);    if($length <= 1) {        return $arr;    }    //如果没有返回,说明数组内的元素个数 多余1个,需要排序    //选择一个标尺    //选择第一个元素    $base_num = $arr[0];    //遍历 除了标尺外的所有元素,按照大小关系放入两个数组内    //