• 数组排序(6)- 快速排序


    (一)快速排序

        快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

      1.算法描述;

        (1)从数列中挑出一个元素,称为 “基准”(pivot);

        (2)重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

        (3)递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。 

      2.手动模拟排序:

      

      3.算法分析:

      (1)最佳情况:平均情况:T(n) = O(nlogn) 

      (2)空间复杂度: O(logn)

      (3)稳定性: 不稳定

    (二)代码实现:

    public class QuickSort {
        public static void main(String[] args) {
            int[] arr = {3,4,1,2,7,8,6,5,9};
            sort(arr);//快速排序
            System.out.println("-----------------------------------------");
            print(arr);//打印结果
        }
    
        public static void sort(int[] arr){
            if(arr == null || arr.length <= 1){
                return;
            }
            sort(arr,0,arr.length - 1);
        }
    
        private static void sort(int[] arr, int left, int right) {
            //边界
            if(left >= right){
                return;
            }
            //获取基数
            int pivot = arr[left];
            int index = partition(arr,left,right);
            sort(arr,left,index - 1);
            sort(arr,index + 1,right);
        }
    
        private static int partition(int[] arr, int left, int right) {
            int pivot = arr[left];
            while (left < right) {
                while (left < right && arr[right] >= pivot) {
                    right--;
                }
                arr[left] = arr[right];
                // arr[left++] = arr[right];
                while (left < right && arr[left] <= pivot) {
                    left++;
                }
                // arr[right--] = arr[left];
                arr[right] = arr[left];
            }
            // left == right
            arr[left] = pivot;
            print(arr);
            return left;
        }
    
        public static void print(int[] arr){
            StringBuilder sb = new StringBuilder("[");
            for (int i = 0; i < arr.length; i++) {
                sb.append(arr[i]);
                if(i != arr.length - 1){
                    sb.append(", ");
                }
            }
            System.out.println(sb.append("]"));
        }
    }
    QuickSort
  • 相关阅读:
    jQuery插件开发精品教程,让你的jQuery提升一个台阶
    Elasticsearch 更新和删除文档的过程
    Elasticsearch集群健康状态显示为yellow排查
    Golang官方包依赖管理工具 go mod
    Golang几种常用配置文件使用方法总结
    SQL高级功能:窗口函数
    MySQL经典50题
    MySQL 性能调优和系统资源优化解决方案
    【排序算法】堆排序的推导及实现
    增长策略:如何用AB测试进行活动评估及优化?
  • 原文地址:https://www.cnblogs.com/bug-baba/p/10548721.html
Copyright © 2020-2023  润新知