算法 排序算法之快速排序

来源:互联网 发布:windows live id注册 编辑:程序博客网 时间:2024/06/08 00:50
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;    }}

0 0
原创粉丝点击