算法 排序算法之快速排序

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;
    }
}

点赞