首页 > 其他分享 >计数排序 (Counting Sort)

计数排序 (Counting Sort)

时间:2024-09-14 13:52:21浏览次数:10  
标签:Sort 排序 int 元素 计数 数组 array Counting

(1)算法简介

       计数排序是一种非比较排序算法,主要用于对整数进行排序。它通过计算每个元素在数组中出现的次数来确定其在排序后数组中的位置。这种排序算法适用于元素范围较小且数据量较大的场景。


同样,我们接下来带着你边学如何实现排序算法边理解该算法的内核。


       (2)算法的原理与步骤

       计数排序的基本思想是创建一个计数数组,通过统计原始数组中每个元素的出现次数来确定它们在排序后数组中的正确位置。具体步骤如下:


计算最大值和最小值: 确定数组中的最大值和最小值,进而决定计数数组的大小。


计数: 创建一个计数数组,将每个元素出现的次数记录在计数数组中。


累加计数: 对计数数组中的值进行累加,以便确定每个元素的最终位置。


构建排序数组: 遍历原始数组,通过计数数组确定每个元素在排序后数组中的位置,构建最终的有序数组。


       ——接下来让我们使用代码来实现一下计数排序。


       (3)Java代码实现

public void countSort(int[] array) {

   // 初始化最小值和最大值为数组的第一个元素

   int min = array[0];

   int max = array[0];

   

   // 遍历数组,找到最小值和最大值

   for (int i = 0; i < array.length; i++) {

       if (array[i] < min) {

           min = array[i];

       }

       if (array[i] > max) {

           max = array[i];

       }

   }

   

   // 创建计数数组,用于统计每个元素出现的次数

   int[] count = new int[max - min + 1];

   

   // 统计数组中每个元素出现的次数

   for (int i = 0; i < array.length; i++) {

       count[array[i] - min]++;

   }

   

   // 将排序后的元素放回原数组

   int arrayIndex = 0;

   for (int i = 0; i < count.length; i++) {

       // 对计数数组进行处理,将每个元素根据其计数放入原数组中

       while (count[i] != 0) {

           array[arrayIndex++] = i + min;

           count[i]--;

       }

   }

}

解释:


int min = array[0]; int max = array[0];:初始化最小值和最大值为数组的第一个元素。


for (int i = 0; i < array.length; i++):遍历数组,找到最小值和最大值。


int[] count = new int[max - min + 1];:创建计数数组 count,其长度为 max - min + 1,用来存储每个值的出现次数。


for (int i = 0; i < array.length; i++):遍历数组并填充计数数组。


count[array[i] - min]++:更新计数数组中的值,表示 array[i] 出现的次数。


for (int i = 0; i < count.length; i++):遍历计数数组,并将排序后的元素放回原数组中。


while (count[i] != 0):根据计数数组的值将元素放入原数组中,每个元素按照计数的次数放入对应的位置。


       ——这样我们就实现了计数排序算法了!!!


       (4)时间复杂度和空间复杂度

时间复杂度: O(n+k)O(n + k)O(n+k),其中 nnn 是数组的长度,kkk 是数组中元素的范围(最大值与最小值之间的差值)。


空间复杂度: O(k)O(k)O(k)。计数排序需要额外的计数数组,空间复杂度与元素的范围成正比。


       (5)算法的应用场景

计数排序的特点使其适用于以下场景:


数据范围较小的整数排序: 计数排序适合整数范围较小的排序任务,如考试成绩、年龄等。


需要稳定排序的场景: 计数排序是一种稳定的排序算法,适用于需要保持相同元素相对顺序的场景。


数据分布相对均匀: 如果数据分布极度不均匀,计数排序的效率会大大降低,因此适用于数据分布较为均匀的情况。


标签:Sort,排序,int,元素,计数,数组,array,Counting
From: https://blog.51cto.com/u_16270801/12016311

相关文章

  • Spark-ShuffleWriter-BypassMergeSortShuffleWriter
    一、上下文《Spark-ShuffleWriter》中对ShuffleWriter的获取、分类和写入做了简单的分析,下面我们对其中的BypassMergeSortShuffleWriter做更详细的学习二、创建ShuffleMapOutputWriterShuffleMapOutputWritermapOutputWriter=shuffleExecutorComponents.createMapO......
  • ACCT3003: Accounting Modelling and Data
    ACCT3003:AccountingModellingandDataVisualisationFolioAssignmentGuide,Semester2, 2024Due Date for Submission: Sunday 15/9/2024 at 5.00 PMPleasenotethatthePractical AssignmentforACCT3003AccountingModellingandDataVisualisationis......
  • 桶排序,计数排序
    桶排序(bucketsort)是分治策略的一个典型应用。它通过设置一些具有大小顺序的桶,每个桶对应一个数据范围,将数据平均分配到各个桶中;然后,在每个桶内部分别执行排序(递归);最终按照桶的顺序将所有数据合并。从桶排序的角度看,我们可以将计数排序中的计数数组counter的每个索引视为一个桶......
  • SortableTableView:Android 表格视图库
    在Android应用开发中,提供用户交云和数据展示的功能是非常重要的。SortableTableView是一个开源的Android库,它提供了一个简单的TableView组件以及一个更高级的可排序TableView,允许开发者实现复杂的表格视图和数据排序功能。文章目录......
  • 【05】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-条件渲染+if/switch判断与for/
     序言:本文详细介绍了ArkTs语言中的数组、if单双多分支判断、switch判读、while循环、for循环并给出相应的具体案例和实现代码,附有综合案例京东购物的加购。笔者也是跟着B站黑马的课程一步步学习,学习的过程中添加部分自己的想法整理为笔记分享出来,如有代码错误或笔误,欢迎指正......
  • 【数据结构】详细介绍各种排序算法,包含希尔排序,堆排序,快排,归并,计数排序
    目录1.排序1.1概念1.2常见排序算法2.插入排序2.1直接插入排序2.1.1基本思想2.1.2代码实现2.1.3特性2.2 希尔排序(缩小增量排序)2.2.1基本思想2.2.2 单个gap组的比较2.2.3 多个gap组比较(一次预排序)2.2.4 多次预排序2.2.5 特性3.选择排序3.1直......
  • 2529. 正整数和负整数的最大计数
    题目链接2529.正整数和负整数的最大计数思路二分法题解链接标准库调用关键点0的处理时间复杂度\(O(\logn)\)空间复杂度\(O(1)\)代码实现:classSolution:defmaximumCount(self,nums:List[int])->int:deflower_bound(val):......
  • ACCT1101 Accounting for Decision Making
    ACCT1101AccountingforDecisionMakingProblemSetAssessmentType:ProblemSet/sLearningObjectivesAssessed:1,2,3,4DueDate:13September202415:00(3pmBrisbanetime)Weight:25%IndividualTaskDescription:Thisassessmentisbasedonacaseo......
  • 计数器 CountDownLatch
    CountDownLatchSemaphore更加适合用于控制对有限资源的访问,特别是当你需要允许一定数量的线程同时访问资源时CountDownLatch更加适合用于协调多个线程的完成状态,确保在某些操作完成后再执行后续操作它用于协调多个线程的执行,使得某些操作必须等到其他操作完成后才能继续进行,......
  • 循环计数器/循环栅栏/循环屏障 CyclicBarrier
    CyclicBarrier和CountDownLatch有点类似,主要区别是CyclicBarrier可以重用,常用方法如下:CyclicBarrierbarrier=newCyclicBarrier(3);//表示条件为:要有3个线程达到屏障(未指定屏障动作)barrier.await();//如果没有3个线程到达屏障,当前线程就阻塞,直到有3个线程达到......