zoukankan      html  css  js  c++  java
  • 基础-快速排序(基本)

    简单的快排就是定义一个基准数和一左一右两个“哨兵”,右侧哨兵找比不大于基准数的值,左侧找不小于基准的数,找到后交换两个哨兵对应值的位置,然后继续向左,向右寻找符合条件的数,知道左、右哨兵相遇后,将基准值和左哨兵值交换即可,此时,交换后的基准值左侧都是小于它的值,右侧都是大于它的值,然后以此方式分别处理左侧数据和右侧数据

    package com.nxz.blog.otherTest;
    
    public class Test {
    
        public static void main(String[] args) {
            Test t = new Test();
            int[] ints = {2, 1, 4, 5, 6, 3, 8, 1, 0, 22, 33, 12, 1, 2};
            t.quickSort(ints, 0, ints.length - 1);
    
            for (int i : ints) {
                System.out.print(i + " ");
            }
        }
    
        /**
         * 基本的快排,就最左侧数设置为基准数,设置l,r索引,分别代表左侧索引值,和右侧索引值,r递减从右侧开始找比基准小的数,l递增从左侧开始找比基准大的数,
         * 然后将两个数调换位置,循环多次知道l==r时,终止循环,最终将基准数和l值调换位置,
         * 然后递归调用quickSort(left,i-1),quickSort(i+1,right)
         *
         * @param arr
         */
        public void quickSort(int[] arr, int left, int right) {
    
            //递归终止条件
            if (left > right) {
                return;
            }
            int base = arr[left];
            int l = left;
            int r = right;
    
            //l=r时就不用再次循环比较了  一趟代表只调换了两个值,以一个值为基准时,会多次调换值,因此需要循环,直到l==r时,代表该基准值左右侧已经调换完毕,最后
            //再将基准值和l值调换即可(也就是讲基准值归位,左侧为小于基准的数,右侧为大于基准的数)
            while (l != r) {
                //从右侧找小于基准的数
                while (l < r && arr[r] >= base) {
                    r--;
                }
                //从左侧找大于基准的数
                while (l < r && arr[l] <= base) {
                    l++;
                }
    
                if (l < r) {
                    swapInt(arr, l, r);
                }
            }
    
            //基准和l调换
            swapInt(arr, left, l);
    
            //递归左侧和右侧数组 (采用分治的思想,两个递归方法调用完毕后,就认为左右两侧已经排好)
            quickSort(arr, left, l - 1);
            quickSort(arr, l + 1, right);
        }
    
        /**
         * 交换数组中的两个数
         *
         * @param arr
         * @param left
         * @param right
         */
        private void swapInt(int[] arr, int left, int right) {
            int temp = arr[left];
            arr[left] = arr[right];
            arr[right] = temp;
        }
    }
  • 相关阅读:
    hbase
    2013年实习
    Distinct Subsequences
    LumiSoft
    Implicit super constructor xx() is undefined for default constructor. Must define an explicit constructor
    XmlDocument.LoadXml和Load的区别
    应输入 #endregion 指令报错的排查技巧
    c#删除list中的元素
    Dragon Balls(hdu3635带权并查集)
    Java实现 蓝桥杯 算法训练 寻找数组中最大值
  • 原文地址:https://www.cnblogs.com/nxzblogs/p/11141199.html
Copyright © 2011-2022 走看看