快速排序算法,是在冒泡排序算法之上,进行改进后的一种算法。其时间复杂度为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);}}
