Java快速排序

来源:互联网 发布:电梯运行优化 编辑:程序博客网 时间:2024/06/14 20:04
package sort;
/**
 * 快速排序
 * @author LTF
 *
 */
public class FastSort2 {


public static void main(String[] args) {
// TODO Auto-generated method stub
//定义一个数组
int [] a = {9,5,6,18,7,4,45,52,33,12,5,3};
//定义开始的下标
int start = 0;
//定义最后一个数的下标
int end = a.length-1;
//执行快排的方法
sort(a, start, end);
//遍历输出
for (int i : a) {
System.out.print(i+"    ");
}


}
/**
* 快速排序的方法
* 比基准数大的放在基准数的右边
* 比基准数小的放在基准数的前边
* @param a
* @param left
* @param right
*/
public static void sort(int a[],int left ,int right){
//开始的下标
int start = left;
//最后的下标
int end = right;
//基准数(第一个数)
//如果选取第一个数为基准数那就从后往前先比较
//如果选取最后一个数为基准数那就从前往后先比较
int key = a[left];

//判断最后一个下标和第一个下标是否重合
while(end > start){

//从后往前比较
//如果最后的数比基准数大就是正确的,然后比较倒数第二个,以此类推
//如果比基准数小了,那就需要位置调换
while(end > start && a[end] >= key){
end--;
}
//从后往前的数比基准数小了;进行位置调换
if (a[end] <= key) {
int temp  = a[end];
a[end] = a[start];
a[start] = temp;
}

//从前往后比较
//第一个数小于等于基准数,是正确的,比较下一个,比基准数小就是正确的
//比基准数大,就需要调换位置
while(end > start && a[start] <= key){
start++;
}
//判断比基准数大  需要调换位置
if (a[start] >= key) {
int temp = a[start];
a[start] = a[end];
a[end] = temp;
}
}
//大循环把基准数的位置确定了,比基准数小的在基准数前边,比基准数大的在基准数后边
//把基准数前边的在定义成一个数组,继续比较,进行排序
//当跳出这个大while循环时,start和end是相等的,也就是说这个位置就是基准数的位置
//那这个时候基准数位置已经确定,但是真个数组还没有排序,这时候需要对整个数组进行排序,还是用
//的这个方法进行快速排序
//start是基准数位置,他以前的比基准数都小,那就把基准数左边的看作一个数组,进行快排
//start是基准数的位置,left是从最左边开始,初始值是0,a是数组,从0开始,到基准数减一结束,然后继续快排
if (start > left) {
sort(a, left, start-1);
}
//end也是基准数的位置,right是从最右边开始,也就是最后的一个下标,a是数组,从end+1开始,到最后结束
if (end < right) {
sort(a, end+1, right);
}



}


}