快速排序算法,是在冒泡排序算法之上,进行改进后的一种算法。其时间复杂度为O(nlogn),是所有时间复杂度相同的排序算法中性能最好的排序算法。
快速排序算法的思想是:通过一次排序,将整个无序表以标志位为分割点,划分为相互独立的两个部分,其中一部分的数据都比标志位的值要小,另一部分的数据都比标志位的值要大,然后继续对这两部分数据进行同样的分割操作,直到每一个小部分不可再分之后,所得到的整个序列就是有序序列。
import java.util.Arrays;
/**
* 快速排序
* 不稳定排序
*/
public class QuickSort {
public int[] quickSort(int[] arrays){
if(null == arrays){
throw new NullPointerException("arrays is null");
}
if(!(arrays.length>0)) {
return arrays;
}
int[] sortArrays = Arrays.copyOf(arrays, arrays.length);
quickSort(sortArrays,0,sortArrays.length-1);
return sortArrays;
}
private void quickSort(int[] nums,int lowNum,int highNum){
if(lowNum<highNum){
//找到中间值(将小于中间值的放前面,大于中间值的放后面)
int middle = getMiddle(nums, lowNum, highNum);
//排序小于中间值的部分
quickSort(nums, lowNum, middle-1);
//排序大于中间值的部分
quickSort(nums, middle+1, highNum);
}
}
private int getMiddle(int[] nums,int lowNum,int highNum){
//取最低位的值作为标志//当然,也可以用最高位作为标志
//去最低位或者最高位有一个好处,后面就会看到
int temp = nums[lowNum];
//在未找到标志最终存储的位置时,一直循环
//直到lowNum = highNum的时候
//就是标志最终存储的位置
while(lowNum<highNum){
/**
* 在数组两个值比较的时候,没有等于号,会出现死循环 1,3,4,2,4 temp = 4,lowNum=2,highNum=4,这样就会一直死循环
* 没有 end>start ,则会出现数组下标越界的情况
* */
//因为我们取的最低为做标志,即低于temp的值有一个空格
//则可以先放一个高位上低于temp的值到该空格中
//第一个while循环:从最高位向前遍历,直到遇到第一个小于temp的位置
//放在lowNum下标的位置,即将小于temp的值放在temp的前面
while(lowNum<highNum&&temp<=nums[highNum]){
highNum--;
}
nums[lowNum] = nums[highNum];
//第二个while循环:从最低位向后遍历,直到遇到第一个大于temp的位置,
//因为前面已经将highNum位置的值放在了lowNum下标处
//则可以将该大于temp的值放在highNum下标的位置
//--不是最高位,是经过第一个while循环之后,空出来的位置
while(lowNum<highNum&&temp>=nums[lowNum]){
lowNum++;
}
nums[highNum] = nums[lowNum];
//然后进入while的括号条件中进行lowNum与highNum比较
}
//执行到这里 lowNum和highNum值相等,即找到了标志temp的在最最终排好序的数组中的位置
nums[lowNum] = temp;
return lowNum;
}
public void println(int [] a) {
for(int x:a) {
System.out.print(" "+x);
}
System.out.println("");
}
public static void main(String[] args) {
int [] a = {2,99,89,87,58,96,94,56,45,12,35,20,44,77,18};
QuickSort quickSort = new QuickSort();
quickSort.quickSort(a);
}
}