首页 > 其他分享 >桶排序

桶排序

时间:2023-12-20 16:11:17浏览次数:27  
标签:target int ++ frequency 排序 public

桶排序

计数排序&基数排序

思路来源

一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到

笔记内容

  • 特点:不基于比较的排序

  • 算法思路

    1. 计数排序

      申明一个定长数组,遍历数据并在对应数值的下标频率统计加一,最后根据频率数组进行输出。

      待排序的数据必须有范围限制,能够用数组进行频率统计

    2. 基数排序

      找出最大位数,根据最大位数补全小于位数数值(在前面加0),根据位数从低到高进行排序(个 --> 十 --> 百 .....)

      在优化算法中,用词频表实现进行统计,然后逆序遍历数组,按照词频表中给出的最后一位下标进行填充排,输出排序。

      待排数据必须有进制

  • 代码实现

    public class BucketSorting {
        public static void main(String[] args) {
           int[] target1 = {4,55,66,77,4,55,188,15,9,44,65};
           //countingSort(target1);
            bucketSort(target1);
        }
    
        //计数排序
        public static void countingSort(int[] target){
            int[] frequency = new int[200];
            int[] result = new int[target.length];
            int count = 0;
            for (int i = 0; i < target.length; i++) {
                frequency[target[i]]++;
            }
            for (int i = 0; i < frequency.length; i++) {
                if(frequency[i] != 0){
                    while (frequency[i] > 0){
                        result[count] = i;
                        count++;
                        frequency[i]--;
                    }
                }
            }
            print(result);
        }
    
        //基数排序
        public static void bucketSort(int[] target){
            int maxBit = maxBitNum(target); //最大位数
            int total = 10;
            for (int i = 1; i <= maxBit ; i++) {
                int[] frequency = new int[total];
                int[] result = new int[target.length];
                for (int j = 0; j < target.length; j++) {
                    int num = appointNum(target[j],i);
                    frequency[num]++;
                }
                for (int j = 1; j < frequency.length; j++) {
                    frequency[j] += frequency[j-1];
                }
                for (int j = target.length-1; j > -1 ; j--) {
                    int index = frequency[appointNum(target[j],i)]-1;
                    result[index] = target[j];
                    frequency[appointNum(target[j],i)]--;
                }
                target = result;
                //print(result);
            }
            print(target);
        }
    
        public static void print(int[] target){
            for (int i = 0; i < target.length; i++) {
                System.out.print(target[i]+" ");
            }
            System.out.println("");
        }
    
        //获取最大位数
        public static int maxBitNum(int[] target){
           int max = Integer.MIN_VALUE;
            for (int i = 0; i < target.length; i++) {
                int num = 0;
                int temp = target[i];
                while (temp != 0){
                    num++;
                    temp /= 10;
                }
                if(max < num){
                    max = num;
                }
            }
            return max;
        }
    
        //获取位置数
        public static int appointNum(int target,int d){
           return (target/(int)Math.pow(10,d-1))%10;
        }
    }
    

标签:target,int,++,frequency,排序,public
From: https://www.cnblogs.com/nouleeee/p/17916714.html

相关文章

  • [LeetCode] LeetCode81. 搜索旋转排序数组II
    题目描述思路:是lc33.搜索旋转排序数组的延伸,允许包含重复元素起初:当nums[left]<=nums[mid]时,区间[left,mid]有序当nums[left]>nums[mid]时,区间[mid,right]有序但是这个题目当nums[left]==nums[mid]时,无法判断哪个区间是有序的,无法判断target位于左侧还是右侧,此时无......
  • [LeetCode Hot 100] LeetCode153. 寻找旋转排序数组中的最小值
    题目描述思路如果数组翻转后又回到升序的情况,即nums[left]<=nums[right],则nums[left]就是最小值,直接返回。如果数组翻转,需要找到数组中第二部分的第一个元素:若nums[left]<=nums[mid],说明区间[left,mid]连续递增,则最小元素一定不在这个区间里,可以直接排除,最小值在[......
  • 912. 排序数组---快速排序
    1.题目介绍给你一个整数数组 \(nums\),请你将该数组升序排列。示例1:输入:nums=[5,2,3,1]输出:[1,2,3,5]示例2:输入:nums=[5,1,1,2,0,0]输出:[0,0,1,1,2,5]提示:\(1<=nums.length<=5*10^{4}\)\(-5*10^{4}<=nums[i]<=5*10^{4}\)2.题解2.1随机化快速排......
  • 详解十大经典排序算法(五):归并排序(Merge Sort)
    算法原理归并排序的核心思想是将一个大的数组分割成多个小的子数组,然后分别对这些子数组进行排序,最后将排序后的子数组合并起来,得到一个有序的大数组。算法描述归并排序(MergeSort)是一种经典的排序算法,其原理基于分治(DivideandConquer)策略。它的核心思想是将一个大问题分割成多个......
  • 详解十大经典排序算法(四):希尔排序(Shell Sort)
    算法原理希尔排序是一种基于插入排序的排序算法,也被称为缩小增量排序。它通过将待排序的序列分割成若干个子序列,对每个子序列进行插入排序,然后逐步缩小增量,最终使整个序列有序。算法描述希尔排序(ShellSort)是一种基于插入排序的算法,由DonaldShell于1959年提出。它是插入排序的一种......
  • 堆排序
    堆排序heapInsert&heapify排序思路来源一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到笔记内容问题描述对一个数组进行大根堆排序算法思路heapInsert:视为用户一个个插入新数值,由下往上比较heapify:视为对所有子树排序,由子树的头结点从上往......
  • [LeetCode Hot 100] LeetCode33. 搜索旋转排序数组
    题目描述思路如果nums[left]<=nums[mid],则[left,mid]有序如果nums[left]>nums[mid],则[mid,right]有序方法一:classSolution{publicintsearch(int[]nums,inttarget){if(nums==null||nums.length==0)return-1;intleft=0,ri......
  • [LeetCode Hot 100] LeetCode34.在排序数组中查找元素的第一个和最后一个位置
    题目描述思路:二分查找之寻找左右侧边界两个关键点:1.数组有序;2.时间复杂度O(logn)方法一:classSolution{publicint[]searchRange(int[]nums,inttarget){if(nums.length==0||nums==null){returnnewint[]{-1,-1};}......
  • [排序,贪心,置换环]洛谷P1327&&P8637,双倍经验
    前置知识:置换环,最小交换次数https://blog.csdn.net/yunxiaoqinghe/article/details/113153795?ops_request_misc=&request_id=&biz_id=102&utm_term=%E6%9C%80%E5%B0%91%E4%BB%BB%E6%84%8F%E4%BA%A4%E6%8D%A2%E6%8E%92%E5%BA%8F%E8%AF%81%E6%98%8E%E7%94%A8%E7%BD%AE%E6%8D......
  • 数据结构算法---二叉排序树
    二叉排序树(BinarySearchTree,BST),也称为二叉搜索树或二叉查找树,是一种经典的数据结构,它满足以下性质:对于树中的每个节点,其左子树中的所有节点的值都小于该节点的值。对于树中的每个节点,其右子树中的所有节点的值都大于该节点的值。左子树和右子树也都是二叉排序树。基于这些性......