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

    一、基本介绍

    ​ 冒泡排序是对冒泡排序的一种改进,其基本思想是:通过一趟排序将待排序数据分割成独立的两个部分,其中一部分比另一部分的最小数据还要小,然后在依照此方法对两部分数据分别使用快速排序,最终形成有序序列。

    二、排序过程

    对数组[2 , 10 , 33 , 6 , 21 , 3 , 18] 从小到大排序过程如下:

      	1. 首先定义一个左边的指针 low 和一个右边的指针 high 记录位置,以及一个中间参考值 mid ,初始时设置 mid = ( mid + high ) / 2 。
      	2. 左指针指向的值与中间参考值比较,值小于中间值,low 后移加一;右指针指向的值与中间参考值比较,值大于中间值,low 前移减一。
      	3. 当左指针指向的值大于中间值,右指针指向的值小于中间值时,交换两个位置的值,然后左指针后移加一,右指针前移减一。
      	4. 当左指针大于右指针时,退出比较,否则重复第二步。
    

    第一次递归过程图如下:

    后续依次对左边部分和右边部分分别进行快速排序,实现数组排序。

    三、代码实现

    ​ 参考值的取值可以自己定,这里代码实现取的参考值是中间的那一个数据。

    public static void quickSort(int[] arr, int left, int right) {
        if (arr == null || arr.length < 2) {//数组为空或者长度为1直接返回
            return;
        }
        int low = left;//定义左指针
        int high = right;//定义右指针
        int pivot = arr[(left + right) / 2];//定义参考变量值
        int temp = 0;
        while (low < high) {//当左指针小于右指针时进行遍历排序
            while (arr[low] < pivot) {//从左边依次循环找出大于参考值的索引
                low++;//指针后移
            }
            while (arr[high] > pivot) {//从右边依次循环找出小于参考值的索引
                high--;//指针前移
            }
            if (low >= high) {//如果左指针大于大于右指针则退出循环
                break;
            }
            //交换值
            temp = arr[low];
            arr[low] = arr[high];
            arr[high] = temp;
            if (arr[low] == pivot) {//当交换后,左指针指向的值等于参考值,右指针前移
                high--;
            }
            if (arr[high] == pivot) {//当交换后,左指针指向的值等于参考值,左指针前移
                low++;
            }
        }
        if(low == high){//左右指针相等时,左指针后移,右指针前移,防止栈溢出
            low++;
            high--;
        }
        if (left < high) {//左递归,对左边部分进行排序
            quickSort(arr, left, high);
        }
        if (right > low) {//右递归,对右边部分进行排序
            quickSort(arr, low, right);
        }
    }
    
  • 相关阅读:
    AngularJs 1.x和AngularJs2的区别
    AngularJS ui-router (嵌套路由)
    $scope.$apply
    AngularJS中的$watch(),$digest()和$apply()区分
    对比jQuery和AngularJS的不同思维模式
    angular.element 动态添加和删除元素
    [Leetcode] Integer to Roman
    [Leetcode] Longest Common Prefix
    [Leetcode] Plus One
    [Leetcode] Palindrome Number
  • 原文地址:https://www.cnblogs.com/Mhang/p/12331384.html
Copyright © 2011-2022 走看看