注意点
- 分治思想、递归思想
- 时间复杂度O(nlogn),适合大规模数据排序
- 在数组中 找一个分区点,把数据分隔成两区间,一部分小于分区点,一部分大于分区点,然后递归处理分隔后的连个小的区间。
- 原地排序,不占用太多额外空间
package algorithm.sort;
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int[] arr = {11,6,8,2,1,4,13};
sort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
private static void sort(int[] arr,int head,int tail) {
if(head > tail) return;
int q = partition(arr,head, tail);
sort(arr,head,q-1);
sort(arr,q+1,tail);
}
/**
* 分区,根据分区点,把数据分成两半
* @param arr
* @param head
* @param tail
* @return
*/
private static int partition(int[] arr,int head,int tail){
int pivot = arr[tail];//分区点
int i = head;
for(int j=head;j<=tail-1;j++) {
if(arr[j] < pivot) {
//swap arr[i] with arr[j]
int tmp = arr[j];
arr[j] = arr[i];
arr[i] = tmp;
i++;
}
}
//swap arr[i] with arr[tail]
arr[tail] = arr[i];
arr[i] = pivot;
return i;
}
}