zoukankan      html  css  js  c++  java
  • 快速排序算法(java实现)

    快速排序算法是基于冒泡排序的,是对冒泡排序算法的一个改进。快速排序的效率比较高,是因为它的交换是跳跃式的。每次设置一个基准值,在比较的时候,将小于基准值的元素移到左边,将大于基准值的元素移到右边,这边一般不会只交换相邻的两个数。因此比较和交换的次数都会减少了,排序的效率自然也就高了。

    快速排序的思想:

    ①在数组中找一个基准值,一般是取第一个数(纯粹为了方便);

    ②建立一个索引right,从数组的尾端开始遍历,直到找到一个比基准值小的数,记录此位置(j);

    ③建立一个索引left,从数组的首端开始遍历,直到找到一个比基准值大的数,记录此位置(i);

    ④当 i < j,则交换i和j两个位置上的值,并且继续在j-1位置开始往前遍历,在i+1位置开始往后遍历;

    ⑤当i == j,证明本次的比较已经结束,此时将i位置的值与基准值交换,基准值已经放在了最终的位置(此时基准值左边的元素都比基准值要小,基准值右边的元素都比基准值要大);

    ⑥在①~⑤的步骤中,基准值已经放在了正确的位置,我们可以对基准值左边的分区以及基准值右边的分区分别重复进行①~⑤的步骤,直到所有元素有序。

    通过以上的步骤可以看出,快速排序算法其实是基于分治算法来实现的。不难写出实现代码:

    public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入数组大小:");
            int size = sc.nextInt();
            int[] arr = new int[size];
            System.out.println("请输入数组:");
            for(int i = 0; i < size; i++) {
                arr[i] = sc.nextInt();
            }
            quickSort(arr);
            for(int a : arr) {
                System.out.print(a + " ");
            }
        }
        
        public static void quickSort(int[] arr) {
            if(arr == null || arr.length <= 1)
                return;
            sort(arr, 0, arr.length-1);
        }
        
        public static void sort(int[] arr, int left, int right) {
            if(left > right)
                return;
            int baseVal = arr[left];
            int i = left, j = right;
            while(i != j) {
                while(arr[j] >= baseVal && j > i) {
                    j--;
                }
                while(arr[i] <= baseVal && j > i) {
                    i++;
                }
                if(i < j) {
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
            arr[left] = arr[i];
            arr[i] = baseVal;
            sort(arr, left, i-1);
            sort(arr, i+1, right);        
        }
    
    }
  • 相关阅读:
    GetAwaiter和GetResult
    Sql中的小数点和保留位数
    简单工厂类
    c#种GetType()和TypeOf()的区别
    php 内置正则配置邮箱
    通过手机号获取定位
    使用navicat连接mysql 报错:2003-Can't comment to Mysql server on '192.168.X.X'(10038)
    java基础系列(七):内部类的详解
    bootstrap : 响应式导航
    CSS
  • 原文地址:https://www.cnblogs.com/WakingShaw/p/13606652.html
Copyright © 2011-2022 走看看