快速排序算法

快速排序
快速排序是对冒泡排序的一种改进,实现的途径为在数组中取一个数为基数。基数的左边为比基数小的值,基数的右边是比基数大的值
左边的值又可以取基数继续排序 一直到被分成只有一个值的时候 这时已经为有序排序
按下面的例子来说 有一个数组{1,5,2,6,7,3,4,8,9}
会随机选择一个数字作为基数 标准为需要排序的起始索引和结束索引之间的整数随机值 比如上面的例子 随机一个数字为3
将索引为3的值作为基数,也就是数字6为基数。 建立两个索引i 和j i从左开始扫描 j从右开始扫描
基数左边的数字(i<=基数)必须比索引代表的数字大才交换(if(arr[i]>arr[arr]))才交换数字 这时候i肯定是5
遍历结束后所有比5小的数字都在5的左边 所有比5大的数字都在5的右边
将左边的数组继续按照当前方法选随机基数排序 一直到数组只有一个数字的时候排序完成
代码:
 public static int[] quickSort(int[] array, int startIndex, int endIndex) {
        if (array.length < 1 || startIndex < 0 || endIndex >= array.length || startIndex > endIndex) {
            return null;
        }
        int pivotIndex = partition(array, startIndex, endIndex);
        //将小于基数索引的数组继续排序 范围为开始索引到 基数索引-1
        if (startIndex < pivotIndex) {
            quickSort(array, startIndex, pivotIndex - 1);
        }
        //将大于基数索引的数组继续排序 范围为基数索引+1 到 结束索引
        if (endIndex > pivotIndex) {
            quickSort(array, pivotIndex + 1, endIndex);
        }
        return array;
    }


    private static int partition(int[] array, int startIndex, int endIndex) {
        //随机获取一个基准(需要保证在数组内)
        int pivotIndex = (int) (startIndex + Math.random() * (endIndex - startIndex + 1));
        //取出开始索引
        int i = startIndex;
        //遍历开始索引到结束索引的元素
        while (i <= endIndex) {
            //如果在基数左边
            if (i <= pivotIndex) {
                //在基数左边只要值比基数大才交换
                if (array[i] > array[pivotIndex]) {
                    //交换
                    swap(array, i, pivotIndex);
                    //元素值已经变换  记得要更改基数的索引
                    pivotIndex = i;
                }
                //不在基数左边
            } else {
                //只要值比基数小才交换
                if (array[i] < array[pivotIndex]) {
                    //交换
                    swap(array, i, pivotIndex);
                    //将两个值的索引也交换
                    //为什么上面不用交换索引? 因为前面是基数在索引右边  交换索引之后遍历索引会跳过n个元素
                    //如果索引在基数右边 交换索引也就是重新遍历
                    int tmp = pivotIndex;
                    pivotIndex = i;
                    i = tmp;
                }
            }
            i++;
        }
        //返回基数值,只有返回的基数到了最边缘 这部分才算交换结束
//假设一个数组分成两份 左边3个元素 右边4个元素
//只有左边基数元素索引到0 右边基数元素到6才能保证数据的准确性
return pivotIndex; } //交换位置 private static void swap(int[] array, int i, int j) { int temp = array[i]; array[i] = array[j]; array[j] = temp; }
不和别人一样,不复制只真正理解
原文地址:https://www.cnblogs.com/Vinlen/p/12896201.html