著名的排序算法,说是冒泡排序的强化版,刚开始的时候我倒是没看出来和冒泡排序有什么联系,后来想了一想,确实如此,本质上还是非常接近的,都是不断的把最小的数往前移,把最大的数往后放,而且用的都是两数交换的方式。
而且这个算法也是分治法的一种体现。
刚开始我觉得很难理解,但是后来多想了一会儿,就发现其实也没有那么复杂,实现原理还是很简单的,思考出这个算法才是真正难得地方。
基本上照着黑马教程思路实现的,还是需要多思考,提高能力。
public class Quicksort {
public static void main(String[] args) {
int[] arr = {-7,6,1,4,3,2,1};
Qsort(arr);
String s = Arrays.toString(arr);
System.out.println(s);
}
static void Qsort(int[]arr){
int lo = 0;
int hi = arr.length-1;
sort(arr,lo,hi);
}
static void sort(int[]arr,int lo,int hi){
//排序方法----把数组中的数同第一个元素比较大小,大的放左边,小的放右边
if(lo >= hi) {
return;
}
int partition = partition(arr,lo,hi);
sort(arr,lo,partition - 1);
sort(arr,partition + 1,hi);
}
/**
* 这个方法是排序的核心
* @param arr
* @return
*/
private static int partition(int[] arr,int lo,int hi) {
int right = hi + 1;//把指针向右边放一个是为了下面可以正常循环起来
int left = lo;
int i = arr[lo];
while (true) {
//通过遍历指针得到小于枢轴的元素下标
//因为是指针,所以不用把之前比较过的数再次比较
while (arr[--right] > i){
if(right == lo){
break;
}
}
while (arr[++left] < i){
if(left == hi){
break;
}
}
//结束判定
if(left >= right){
break;
}else {
//进行一次交换,一定要记住逻辑顺序,是先判定,后交换,交换是有条件的
exchange(arr,right,left);
}
}
exchange(arr,right,lo);
return right;
}
static void exchange(int[]arr,int right,int left){
int temp;
temp = arr[right];
arr[right] = arr[left];
arr[left] = temp;
}
}