package com.mytest.algorithm;
/**
* @author zhangc
* @since 2018/10/25 16:35
* 快速排序算法: 快速排序和归并排序类似,也使用了分治思想,不同的是分解的方法不同,快速排序是利用一个基准进行分组(默认是最后一个元素) 。而且快速排序是
* 原址交换,不需要合并
**/
public class quickSort {
//假设我们定义左组 ,基准, 右组,快速排序就是递归的对数组拆分。
public static int part(int[] array,int start,int end){
int x = array[end]; //作为基准值
int i = start-1; //作为左组的游标,左组元素加一个,则增加1 ,起始下标为第一个被循环元素下标-1
//循环所有元素
for(int j=start;j<end;j++){
//如果元素小于等于基准,那么说明这个元素应该放到左组里面。
// 如何放:交换
if(array[j]<=x){
i++;
int tem = array[j];
array[j] = array[i];
array[i] = tem;
}
}
//完成所有循环和交换后,这时 我们的i 已经是左组的最后元素的下标。。这个时候把基准值放到左右组之间,依然使用交换。
//这个时候数组就形如 左组 < 基准 < 右组 (注意是组内的元素都比基准小,但是组内并没有排序,所以要继续递归调用该方法,
// 直到左右组元素为1个 ,这个时候就是真正的排序了, a<基准<b )
int tem = array[i+1];
array[i+1] = x;
array[end] = tem;
return i+1;
}
public static void quicksort(int[] array , int start , int end ){
if(start<end){
int position = part(array,start ,end );
//注意是position-1 和 position+1 ,因为position处的元素大小肯定是出于这两组之间,不需要再排序了
quicksort(array, start, position-1);
quicksort(array,position+1 ,end );
}
}
public static void main(String[] args) {
int[] array = { 9, 2, 4, 0, 4, 1, 3, 5 };
quicksort(array, 0, array.length-1);
for (int i : array){
System.out.println(i);
}
}
}