一.简介
快速排序是对冒泡排序的一种改进。
该方法的基本思想是:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
二.实现
package com.vincent;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws Exception{
int[] arr = new int[32];
for(int i=0;i<arr.length;i++){
arr[i] = (int)(Math.random() * 100);
}
System.out.println(Arrays.toString(arr));
quickSort(arr,0,arr.length);
System.out.println(Arrays.toString(arr));
}
/**
* 快速排序
* @param arr
* @param start 排序数据开始索引
* @param end 排序数据结束索引(不包含)
*/
public static void quickSort(int arr[],int start,int end){
int head = start;
int tail = end-1;
//选取比较基数
int base = arr[head];
while(head < tail) {
//数据扫描中与基数比较要防止头尾数据都相等时互换了数据,则会导致无限循环,
// 故可以让其中一个扫描包含等于号以消除无限循环
//从尾部扫描到小于基数的数
while(head < tail && arr[tail] >= base){
tail--;
}
arr[head] = arr[tail];
//从头部扫描到大于等于基数的数
while(head < tail && arr[head] < base){
head++;
}
arr[tail] = arr[head];
}
//循环完后head==tail,head索引位置将是基数所在索引
arr[head] = base;
if(head-start >= 2) {
quickSort(arr, start, head);
}
if(end-tail>=2) {
quickSort(arr, head+1, end);
}
}
}
效果:
三.总结
时间复杂度:O(NlogN)