package SortArith;
/**
* 快速排序
* 基本思想:
* 通过一趟排序,确定某一关键字最终的位置,以此将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的
* 关键字小,则可分别对这两部分记录继续进行排序,已达到整个序列有序的目的。
* 时间复杂度:O(nlogn)
* 空间复杂度:O(nlogn)
* 不稳定排序
*
* @author lwk
*
*/
public class QuickSort {
public static void quickSort(int[] array){
if(array == null || array.length == 0){
return;
}
quickSort(array,0,array.length-1);
}
public static void quickSort(int[] array,int low,int high){
if(low < high){//若low = high 说明所有元素位置均以确定,退出递归
//首先确定其中一个元素最终排序位置,将数组一分为二
int pos = findPos(array,low,high);
//递归再分别排序做左边数组和右边数组
quickSort(array,low,pos - 1);
quickSort(array, pos + 1, high);
}
}
public static int findPos(int[] array,int low,int high){
int val = array[low];
//确定array[low]元素的位置
/**
* 类似两个指针分别指向数组的首位和末尾
* 末尾指针指向的数字若比val大(或相等),则左移,否则,将末尾指针指向的值赋给首位指针位置,此时开始首位指针移动
* 首位指针指向的数字若比val小(或相等),则右移,否则,将首位指针指向的值赋给末尾指针位置,此时开始末尾指针移动
* 若首位指针与末尾指针重合,循环结束,重合位置即为val元素最终确定位置
*/
while(low < high){
//末尾指针指向的数字若比val大(或相等),则左移
//注意:左移过程中也要检查两指针是否已重合 即是否low == high
while(low < high && array[high] >= val){
high--;
}
//否则,将末尾指针指向的值赋给首位指针位置
array[low] = array[high];
//此时开始首位指针移动
//首位指针指向的数字若比val小(或相等),则右移
while(low < high && array[low] <= val){
low++;
}
//否则,将首位指针指向的值赋给末尾指针位置
array[high] = array[low];
//若此时两指针仍未重合,即low < high,末尾指针继续开始移动
}
//low == high处即为指针重合位置,也就是元素val最终确定位置
array[low] = val;
return low;
}
}