思想:分治法 ,递归。
直接上代码。
package com.fjf.test;
/**
* 2018年9月4日 09:46:11
* @author fjf
* 快排实现
*
*
*/
public class QuickSort {
public static void main(String[] args) {
int[] a = { 9, 1, 5, 8, 3, 7, 4, 6, 2 };
print("原来的数组:", a);
quicksort(a,0,a.length-1);
print("快排后的数组:", a);
}
/**
*
* 快排实现
* @param data
*/
static void quicksort(int data[],int left, int right){
int i ,j,temp;
i=left;
j=right;
if(i>j){
return;
}
//temp就是基准位
temp = data[left];
while(i<j){
//先看右边,依次往左递减
while(temp<=data[j]&&i<j){
j--;
}
//再看左边,依次往右递增
while(temp>=data[i]&&i<j){
i++;
}
if(i<j){
int t = data[i];
data[i] = data[j];
data[j] = t;
}
}
//i和j相等,此值与基准值交换
if(i==j){
data[left] = data[i];
data[i] = temp;
}
//递归调整左边
quicksort(data,left,i-1);
//递归调整右边
quicksort(data,i+1,right);
}
static void print(String str, int[] a) {
System.out.println(str);
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
System.out.println("\n------------------");
}
}
具体关于快排:网友的帖子:https://blog.csdn.net/as02446418/article/details/47395867
快排为什么要先从右开始:
我的总结: 因为个 i < j的条件,如果从左往右,i已经到了很右边了,j可能因为i < j这个条件,并未找到比基准值小的数而提前中止了查询。
举个例子: 6,2,3,8,9。
如果,先从左边开始。 基准值为6, i 一直走到了8这个位置;右边开始走,9走到8,还未找到比6小的数,但因为此时已经i=j,进行交换。形成了 8,2,3,6,9 的情况,看到出 基准的值的左边并不是都小于它。
如果,正确的做法。 先右边。 j走到3的位置,i开始走,也是在3的位置,不符合i < j 条件,交换,形成 3,2,6,8,9 的情况,正确。
当然,凡事无绝对,也可以从左边开始,这里就不赘述了。