首页 > 其他分享 >计数排序

计数排序

时间:2023-07-03 21:34:08浏览次数:24  
标签:arr min int 计数 num 数组 排序

计数排序是一种非比较的排序算法,它的时间复杂度是O(n+k),其中n是待排序数组的长度,k是数组中的最大值。计数排序的基本思想是,对于每个输入元素x,确定小于等于x的元素个数,然后把x放在输出数组中对应的位置上。为了实现这个过程,需要一个额外的数组C,用来存储每个元素出现的次数,以及一个累加数组D,用来存储每个元素在输出数组中的位置。计数排序的步骤如下:

  1. 找出待排序数组A中的最大值和最小值,确定数组C和D的长度为k+1,其中k是最大值和最小值的差。
  2. 遍历数组A,对于每个元素A[i],将C[A[i]]加一,表示A[i]出现了一次。
  3. 遍历数组C,对于每个元素C[j],将D[j]赋值为C[0]到C[j-1]的和,表示小于等于j的元素个数。
  4. 反向遍历数组A,对于每个元素A[i],将其放在输出数组B中的第D[A[i]]个位置上,并将D[A[i]]减一,表示该位置已经被占用。
  5. 返回输出数组B作为排序结果。

下面是一个用Java实现的计数排序算法的示例代码:

public class CountingSort {
    public static int[] sort(int[] arr) {
        //找出数组中的最大值和最小值
        int max = arr[0];
        int min = arr[0];
        for (int num : arr) {
            if (num > max) {
                max = num;
            }
            if (num < min) {
                min = num;
            }
        }
        //确定数组C和D的长度
        int k = max - min;
        int[] C = new int[k + 1];
        int[] D = new int[k + 1];
        //统计每个元素出现的次数
        for (int num : arr) {
            C[num - min]++;
        }
        //计算每个元素在输出数组中的位置
        for (int i = 1; i <= k; i++) {
            D[i] = D[i - 1] + C[i - 1];
        }
        //反向填充输出数组
        int[] B = new int[arr.length];
        for (int i = arr.length - 1; i >= 0; i--) {
            B[D[arr[i] - min]] = arr[i];
            D[arr[i] - min]--;
        }
        //返回排序结果
        return B;
    }

    public static void main(String[] args) {
        //测试数据
        int[] arr = {5, 3, 7, 2, 9, 1, 4, 6, 8};
        //打印原始数组
        System.out.println("原始数组:");
        for (int num : arr) {
            System.out.print(num + " ");
        }
        System.out.println();
        //调用计数排序算法
        arr = sort(arr);
        //打印排序后的数组
        System.out.println("排序后的数组:");
        for (int num : arr) {
            System.out.print(num + " ");
        }
    }
}

标签:arr,min,int,计数,num,数组,排序
From: https://www.cnblogs.com/shoshana-kong/p/17524135.html

相关文章

  • 桶排序算法及其Java实现
    桶排序是一种排序算法,它的原理是将数组分到有限数量的桶里,每个桶再个别排序,最后依次把各个桶中的记录列出来。桶排序的效率取决于映射函数的选择和桶的数量。桶排序适用于数据分布比较均匀,或者比较侧重于区间数量的情况。下面是我为你写的博客正文,希望对你有帮助:桶排序算法及其J......
  • 记录一下Oracle排序 将空值排在最后面
    select*fromtableorderbyxxx(字段)desc 今天在写Oracle排序的时候突然发现,Oracle默认将null值放最上面使用nullsfirst或者nullslast语法Nullsfirst和nullslast是OracleOrderby支持的语法如果Orderby中指定了表达式Nullsfirst则表示null值的记录将排在最前( ......
  • 【numpy基础】--数组排序
    numpy数组通常是用于数值计算的多维数组,而排序功能可以快速、准确地对数据进行排序,从而得到更加清晰、易于分析的结果。在数据分析和处理过程中,常常需要对数据进行排序,以便更好地理解和发现其中的规律和趋势。排序会应用在很多场景中,比如:数据分类:将数据按照一定的特征进行分......
  • C++面试八股文:std::array如何实现编译器排序?
    C++面试八股文:std::array如何实现编译器排序?某日二师兄参加XXX科技公司的C++工程师开发岗位第25面:面试官:array熟悉吗?二师兄:你说的是原生数组还是std::array?面试官:你觉得两者有什么区别?二师兄:区别不是很大,原生数组(非动态数组)和std::array都在栈上开辟空间,初始化的时候......
  • 堆排序
    求最小的K个数 publicint[]getLeastNumbers(int[]arr,intk){if(arr.length==0||k==0){returnnewint[0];}//构建小顶堆buildHeap(arr);//弹出堆顶重排序int[]rsp=newint[k];f......
  • 选读SQL经典实例笔记01_检索和排序
    1. 在WHERE子句中引用别名列1.1. 当表里的某些列没有被恰当命名的时候,这个技巧尤其有用1.2. sqlselectsalassalary,commascommissionfromempwheresalary<50001.3. 内嵌视图1.3.1.  sqlselect*from(selectsalassalary,commascommission......
  • 39. 拓扑排序
    一、什么是拓扑排序  拓扑排序是对有向无圈图的顶点的一种排序,它使得如果存在一条从\(v_{i}\)到\(v_{j}\)的路径,那么排序中\(v_{j}\)出现在\(v_{j}\)的后面。有向边(v,w)表明任务v必须在任务w前完成。显然,如果图含有圈,那么拓扑排序是不可能的,因为对于圈上的两个......
  • 快速排序
    没想到再次回顾快排发现自己对于快排的理解还不是很深入。这是Acwing中模板题快排的时间复杂度为O(nlogn)~O(n^2);   若用《数据结构(C语言版)》中的算法:  【代码解析】voidQuick_Sort(int*arr,intbegin,intend){if(begin>end)r......
  • python的sort函数与sorted函数排序
    1.sort函数sort函数为python内置的列表排序高阶函数,所谓高阶函数,也就是参数为函数或返回值为函数。先看个简单的例子:# 数字列表的排序示例nums=[5,2,9,1,7]nums.sort()print(nums)#输出:[1,2,5,7,9]可以发现排序后,改变了原列表的顺序。而且sort......
  • 八大排序算法——快速排序
    #include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;constintN=1000010;intn;intq[N];voidquick_sort(intl,intr)//快速排序{if(l>=r)return;inti=l-1,j=r+1,x=q[(l+r......