zoukankan      html  css  js  c++  java
  • 快速排序算法

    快速排序
    快速排序是对冒泡排序的一种改进,实现的途径为在数组中取一个数为基数。基数的左边为比基数小的值,基数的右边是比基数大的值
    左边的值又可以取基数继续排序 一直到被分成只有一个值的时候 这时已经为有序排序
    按下面的例子来说 有一个数组{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; }
    不和别人一样,不复制只真正理解
  • 相关阅读:
    day25 初始面向对象
    JavaScript中的apply()和call()
    JavaScript中的arguments详解
    测试使用MarkDown在博客园发布博客
    《Spring实战》 1-2
    总结: 《jQuery基础教程》 5-完结
    总结: 《jQuery基础教程》 1-4章
    做个计划
    Nginx与tomcat组合的简单使用
    利用 Dijit 组件框架打造丰富的用户界面
  • 原文地址:https://www.cnblogs.com/Vinlen/p/12896201.html
Copyright © 2011-2022 走看看