啊哈之排练习

桶排序

冒泡排序

快速排序

package com.company.algorithm.A20211126;

import java.io.FileInputStream;
import java.util.Arrays;
import java.util.Scanner;

public class Sort {

    // 低配版桶排序
    private static void sortBySampleBucket() {
        int[] arr = {5,3,5,2,8}; // 已知
        //1获取最大数字
        int max = 0;
        for (int it : arr)  if(it > max) max = it;
        //2创建一个数组容器
        int[] book = new int[max+1];
        //3开始计数
        for (int i = 0; i < arr.length; i++) {
            book[arr[i]]++;
        }
        //4输出
        for (int i = max; i >= 0 ; i--) {
            if(book[i] == 0) continue;
            for (int j = 0; j < book[i]; j++) {
                System.out.print(i+" ");
            }
        }
    }
    // 以上存在问题 1. 浪费空间,2 无法对对象排序,也就是只对int进行的

    private static void bubbleSort() throws Exception {
        System.setIn(new FileInputStream("D:/data.txt"));
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();//n表示接下来会输入n个数
        int[] arr = new int[n+1];
        for (int i = 1; i <= n; i++) {
            arr[i] = sc.nextInt();
        }

        // 为什么是1到n-1呢,n个数比较n-1次就可以确定1个数的位置
        for (int i = 1; i < n-1; i++) {
            //为什么是n-i呢,前面i个数已经位置排好了,不需要多余的比较了(排到后面了)
            for (int j = 1; j < n-i; j++) {
                if(arr[i] < arr[j]) {
                    int t = arr[j];
                    arr[j] = arr[i];
                    arr[i] = t;
                }
            }
        }

        System.out.println(Arrays.toString(arr));

        // 如果是对象类型,只需要把arr改成obj[]
    }

    //快排是基于一种二分法的思想,每次将基准数归位。
    private static void quicksort() {
        int[] arr = {6,1,2,7,9,3,4,5,10,8};
        quicksortMethod(arr, 0, arr.length-1);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }
    }

    private static void quicksortMethod(int[] arr, int left, int right) {
        if(left > right) return;
        int i = left, j = right, t;
        int base = arr[left];
        while (i != j) {
            // 因为以左边为基准,先从右往左找,找到第一个小于基准的数停下
            while (arr[j] >= base && i < j) {
                j--;
            }
            //再从左边往右边找,找到第一个大于基准的数停下来
            while (arr[i] <= base && i < j) {
                i++;
            }

            //如果没有相遇交换位置
            if(i < j) {
                t = arr[j]; // 交换位置的临时变量
                arr[j] = arr[i];
                arr[i] = t;
            }
        }

        // 在相遇的位置将基准归位
        arr[left] = arr[i]; // 相遇的位置放到最左边
        arr[i] = base;// 左边最基准的值放到相遇的位置

        // 左右两次 循环一样的方法
        quicksortMethod(arr, left, i-1);
        quicksortMethod(arr, i+1, right);
        //事实上每一轮都是为了基准数归为,时间复杂度最差的效率也是 n方,但是平均是 nlogn
    }

    public static void main(String[] args) throws Exception{
        //sortBySampleBucket();
//        bubbleSort();
        quicksort();
    }
}

 

posted @ 2021-11-26 20:04  姓蜀名黍  阅读(42)  评论(0编辑  收藏  举报