`
winxpxt
  • 浏览: 28366 次
  • 性别: Icon_minigender_2
  • 来自: 厦门
社区版块
存档分类

三种线性排序之计数排序

 
阅读更多

一.算法简介

       通过统计元素出现的次数进而排序,需要一个辅助数组,大小是最大元素值(想想计数的过程),为了更好的理解计数排序,我们先来想象一下如果一个数组里所有元素都是非负整数(数组下标是整数),而且都在0-max(由于内存的原因,这个值要小一些)以内,那对于数组里每个元素来说,如果我能知道数组里有多少项小于或等于该元素,就能准确地给出该元素在排序后的数组的位置。

        局限性:通过上面的描述可以看出需要非负整数,而且最大值要在能开数组范围内。

        算法是稳定的,算法第五步从后往前保证了稳定性,希望读者细细体会……

二.算法描述

  1. 求得元素最大值max(看算法实现过程,体会这个方法需要独立,就是说max需要事先确定)
  2. 开辅助数组c[max]和res[原数组大小]并全部初始化为0
  3. 计数:统计元素出现次数并把次数放在c数组的以该元素为下标的位置
  4. 针对c数组从下标1开始,前一项加上后一项并存入后一项获得数组里有多少项小于或等于该元素
  5. 对原数组中的每一个元素temp存入res[c[temp]-1](减一是因为下标从0开始)并更新c[temp]--(不必担心小于0,因为一旦等于0就不会再减小了,因为原数组没该元素了)

三.算法的Java实现

复制代码
public class CountSort {
    public static void main(String[] args) {
        int[] a = { 3, 1, 6, 0, 3, 0, 1, 5, 3, 6 };
        int max = getMax(a);
        arrDisplay(a, "Before mySort:");
        a = mySort(a, max);
        arrDisplay(a, "After  mySort:");
    }

    public static int[] mySort(int[] a, int max) {
        int[] res = new int[a.length];
        int[] c = new int[max + 1];
        for (int i = 0; i < res.length; i++) {
            res[i] = 0;
        }
        for (int i = 0; i < c.length; i++) {
            c[i] = 0;
        }
        int temp = 0;
        /*统计元素出现次数并把次数放在c数组的以该元素为下标的位置
        不可以在这个遍历过程中取最大值,就是说getMax不可合并,因为需要事先c的大小;
        能否直接开为整形最大值,这样不可能,超内存*/
        for (int i = 0; i < a.length; i++) {
            temp = a[i];
            c[temp] = c[temp] + 1;
        }
        for (int i = 1; i < c.length; i++) {
            c[i] = c[i] + c[i - 1];
        }
        
        //必须从后往前,这样保证了稳定性
        for (int i = a.length - 1; i >= 0; i--) {
            temp = a[i];
            res[c[temp] - 1] = temp;
            //不必担心小于0,因为一旦等于0就不会再减小了,因为原数组没该元素了
            c[temp] = c[temp] - 1;
        }
        return res;
    }

    public static int getMax(int[] a) {
        int max = a[0];
        for (int i = 1; i < a.length; i++) {
            if (a[i] > max)
                max = a[i];
        }
        return max;
    }

    public static void arrDisplay(int[] a, String str) {    
        System.out.println(str);
        for (int i = 0; i < a.length; i++)
            System.out.print(a[i] + " ");
        System.out.println();
    }
}
0
6
分享到:
评论

相关推荐

    三种线性排序算法Java实现

    本资源提供的Java实现包括了三种线性排序算法:桶排序(Bucket Sort)、基数排序(Radix Sort)和计数排序(Counting Sort)。这三种算法在特定条件下可以达到线性的平均或最好时间复杂度,效率相对较高。 1. **桶...

    线性时间排序算法

    **计数排序**是一种特殊的线性时间排序算法,适用于输入数据范围较小的情况。该算法假设输入元素为m个整数,这些整数的范围在[1, k]之间。计数排序的主要步骤包括: 1. **初始化计数数组**:创建一个大小为k的计数...

    排序算法之计数排序源代码另附博客地址

    排序算法之计数排序,计数排序是一种线性的排序算法,比基于比较的排序算法效率高,但其应用有特定的领域。我给出了两种策略的计数排序算法,欢迎下载~~如程序中有Bug,恳请指正!

    计数排序算法实例

    计数排序在某些特定情况下可以达到线性时间复杂度,即O(n),其中n为待排序数组的元素数量。它不使用比较操作,而是通过计数和分配来实现排序。 在"算法导论"这本书中,计数排序被作为经典算法介绍,用于教学和理解...

    线性排序:如何根据年龄给100万用户数据排序?.pdf

    本文将探讨线性排序算法,包括桶排序、计数排序和基数排序,并通过一个具体的案例——根据年龄对100万用户数据进行排序,来深入理解这些算法的工作原理及其适用场景。 #### 二、线性排序算法介绍 线性排序算法是一...

    算法与分析实验3: 利用预排序、堆排序和计数排序解决排序问题

    实验要求学生基于预排序、堆排序和计数排序三种算法实现排序功能,并对核心代码进行时间复杂度和空间复杂度的分析。 **预排序算法**: 预排序算法的主要目的是检验数组中元素的唯一性。通过先对数组进行排序,然后...

    计数排序算法的C语言实现

    计数排序是一种非基于比较的排序算法,它的主要思想是通过统计待排序数组中每个元素出现的次数,然后根据这些计数来确定每个元素在排序结果中的位置。这种算法特别适用于整数排序,且在数据范围不大的情况下,效率极...

    排序算法: 冒泡排序,桶排序,计数排序,堆排序,插入排序,合并排序,快速排序,基数排序,选择排序,希尔排序 实现语言: C++

    3. **计数排序**:计数排序是线性时间复杂度的非比较排序算法,适用于整数排序。它统计每个元素在数组中出现的次数,然后根据这些计数来确定输出顺序。 4. **堆排序**:堆排序利用了二叉堆(最大堆或最小堆)的数据...

    线性时间排序.pptx

    线性时间排序是指在处理数据时...虽然比较排序无法突破O(nlgn)的时间复杂度下界,但非比较排序如计数排序提供了在特定条件下实现线性时间复杂度排序的可能性。在实际应用中,选择哪种排序算法取决于数据的特性和需求。

    13线性排序:如何根据年龄给100万用户数据排序?.pdf

    线性排序,包括桶排序、计数排序和基数排序,是一种效率较高的排序算法,其时间复杂度为O(n),这是由于它们不依赖于元素间的比较操作。这些算法适用于特定的数据特性,因此理解它们的适用场景至关重要。 桶排序的...

    线性时间排序培训课件.pptx

    在“线性时间排序培训课件”中,我们针对四种主要的线性时间排序算法进行了详细介绍:计数排序、基数排序、桶排序以及在特定条件下,平均情况和最坏情况下的比较排序算法。 首先,我们介绍了排序算法的理论基础——...

    排序算法编程 堆排序 快速排序

    计数排序是一种线性时间复杂度的排序算法,适用于整数排序。它通过统计每个不同数值出现的次数,然后根据这些统计结果来确定每个元素在输出序列中的位置。由于它不依赖于比较,所以对于大数据集,尤其是数据范围较小...

    MIT算法导论公开课之课程笔记 5.线性时间排序.rar

    线性时间排序的一个经典例子是计数排序(Counting Sort)。这个算法适用于非负整数排序,其基本思想是统计每个数字出现的次数,然后根据这些计数来确定每个元素在输出数组中的位置。具体步骤如下: 1. 初始化一个与...

    三种排序算法的效率比较(文档)

    本文将探讨三种常见的排序算法——计数排序、冒泡排序和插入排序,并对比它们在不同条件下的效率。 首先,计数排序是一种非基于比较的排序算法,它适用于整数排序且数值范围较小的情况。当元素个数众多,且元素跨度...

    算法-理论基础- 排序- 计数排序(包含源程序).rar

    计数排序是一种非基于比较的排序算法,它适用于待排序的元素是整数的情况。这种排序方法的思想是通过计算每个元素在输出数组中应该出现的次数来确定它们的位置,从而达到排序的目的。以下是对计数排序算法的详细介绍...

    线性时间排序算法.pdf

    线性时间排序算法主要指的是...总结来说,计数排序是一种高效的线性时间排序算法,适用于元素值域较小且分布均匀的场景。在满足特定条件的情况下,它可以提供比传统比较排序更快的速度,但同时也受限于输入数据的特性。

    Python3实现计数排序(源代码)

    作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。计数排序的基本步骤如下: 1. **找出待排序的数组中最大和最小的元素**:这一步是为了确定需要开辟的额外数组的大小。 2. **统计...

Global site tag (gtag.js) - Google Analytics