首页 > 编程语言 > 排序算法之线性时间的排序和计数排序初识

排序算法之线性时间的排序和计数排序初识

时间:2024-01-07 19:32:02浏览次数:41  
标签:int max 整数 计数 初识 数组 array 排序

一:概述

前面已经介绍了快速排序和堆排序。它们的时间复杂度都是O(nlogn)。在这篇博文中,要说明的是计数排序的初识和线性时间排序的介绍。

二:具体说明

<1>线性时间排序

例如冒泡排序。如下图所示,因为8>3,所以8和3位置互换。

                                      排序算法之线性时间的排序和计数排序初识_数组

例如堆排序。如下图所示,因为10>7,所以10和7位置交换。

                                      排序算法之线性时间的排序和计数排序初识_计数排序_02

注意:有些特殊的排序并不基于元素的比较,如计数排序、桶排序、基数排序。

<2>初识计数排序

假设数组中有20个随机整数,取值范围为0~10,要求用最快的速度把这个20个整数从小到大进行排序。如何排序呢?由于这些整数只能够在0、1、2、3、4、5、6、7、8、9、10这11个数中取值,取值范围有限。所以根据这些有限的范围,建立一个长度为11的数组。数组的下标是1~10,元素初始值全为0。

                                      排序算法之线性时间的排序和计数排序初识_i++_03

假设有一个20个随机整数的值,首先开始遍历这个无序的随机数列,每一个整数按照其值对号入座,同时,数组下标的元素进行加1操作。

例如第1个整数是9,那么数组的下标为9的元素+1.

                                      排序算法之线性时间的排序和计数排序初识_计数排序_04

第二个整数是3,那么数组下标为3的元素加1.

                                      排序算法之线性时间的排序和计数排序初识_计数排序_05

继续遍历数组并修改数组...

最终,当数组遍历完毕时,数组的装填如下:

                                      排序算法之线性时间的排序和计数排序初识_i++_06

该数组中每一个下标位置的值代表数列中对应整数出现的次数。有了这个统计结果,排序就很简单了。直接遍历数组,输出数组元素的下标值,元素值是几,就输出几次。

注意:计数排序它适用于一些范围内的整数排序。在取值范围内不是很大的情况下,它的性能甚至快过那些时间复杂度为O(nlogn)的排序。

<3>计数排序的代码实现

public static int[] countSort(int[] array) {

    // 1. 得到数列的最大值
    int max = array[0];
    for(int i = 1; i < array.length; i++) {
        if(array[i] > max) {
            max = array[i];
        }
    }
    // .2 根据数列的最大值确定统计数组的长度
    int[] countArray = new int[max + 1];
    // 3. 遍历数列,统计数组
    for(int i = 0; i < array.length; i++) {
        countArray[array[i]]++;
    }

     // 4. 遍历统计数组,输出结果
    int index = 0;
    int[] sortedArray = new int[array.length];
    for(int i = 0; i < countArray.length; i++) {
        for(int j = 0; j < countArray[i]; j++) {
            sortedArray[index++] = i;
        }
    }
    return sortedArray;
}


 public static  void main(String[] args) {
    int[] arr = new int[] {1, 3, 2, 6, 5, 7, 8, 9, 10, 0};
    countSort(arr);
    System.out.println(Arrays.toString(arr));

这段代码在开头有一个步骤,就是求数列的最大整数值max。后面创建的统计数组countArray,长度为max+1.以此来保证数组的最后一个下标是max。

标签:int,max,整数,计数,初识,数组,array,排序
From: https://blog.51cto.com/u_15912723/9134571

相关文章

  • 经典算法题之排序C
    写个快排就完事了。实在不行,写个选择排序也很简单。#include<stdio.h>intdevide(intA[],inthead,inttail){if(head==tail)returnhead;intt=A[head];while(head<tail){while(tail>head&&A[tail]>t)tail--;if(head!=ta......
  • 排序算法之堆排序
    一:概述堆排序是在二叉堆的基础上实现的,如果想要学习堆排序,就得掌握二叉堆。二叉堆的特性是:最大堆的堆顶是整个堆中最大的元素。最小堆的堆顶是整个堆中最小的元素。二:具体说明<1>以最大堆为例讲述如果要删除一个最大堆的堆顶(并不是完全删除,而是跟末尾的节点交换位置),经过自我......
  • 快速排序
    快速排序双指针分治voidquick_sort(intq[],intl,intr){//递归的终止情况if(l>=r)return;//第一步:分成子问题inti=l-1,j=r+1,x=q[l+r>>1];while(i<j){doi++;while(q[i]<x);doj--;while(q[......
  • Exchange学习第一天:初识与安装
    Exchange,作为微软的企业级邮件服务器软件,在企业中扮演着至关重要的角色。今天,我开始了Exchange的学习之旅。一早,我首先了解了Exchange的基本概念和功能。Exchange不仅仅是一个邮件服务器,它还提供了联系人、日历、任务等协作工具,帮助企业提高工作效率。随后,我熟悉了Exchange的安装环......
  • 排序算法
    冒泡排序思想:1、一个无序的数组,n个元素,一共需要排序n-1轮2、在每一轮中,从数组第0位开始,比较相邻两个元素,如果与需求逆序,就交换这两个元素,在每一轮中,可以将当前最大(最小)的元素交换到最后,3、直到执行完n-1轮,没有需要比较的元素为止。代码实现:publicstaticvoidbubSort(in......
  • Python中如何进行字符串计数?
    在Python中,字符串计数是非常基本的操作,使用率极高,可用于多种情况,更是每个Python开发工程师必须掌握的基础技能之一,那么Python中如何进行字符串计数?以下是常用方法介绍。1、使用count()方法Python中的字符串类型具有count()方法,该方法可以返回特定子字符串在字符串中出......
  • 无涯教程-Redis - Sorted Sets(排序集)
    RedisSortedSets与RedisSets类似,它具有存储在集合中的值的独特功能,不同之处在于,排序集的每个元素都与一个分数相关联,该分数用于从最小到最大分数中获取排序的排序集。SortedSets-示例redis127.0.0.1:6379>ZADDLearnfk1redis(integer)1redis127.0.0.1:6379>ZA......
  • 初识Sringboot3+vue3环境准备
    环境准备后端环境准备下载JDK17https://www.oracle.com/java/technologies/downloads/#jdk17-windows   安装就下一步下一步,选择安装路径 配置环境 环境JDK17+、IDEA2021+、maven3.5+、vscode后端基础:javaSE,javaWeb、JDBC、SMM框架(Spring+SpringMVC+MyBatis)、MyBatis-Plus前......
  • 【C】排序算法
    文章介绍了插入排序、希尔排序、选择排序、堆排序、冒泡排序、归并排序的实现思路与使用c编写的代码,同时对排序算法的三个评价要素:时间复杂度、空间复杂度、稳定性,分别进行了具体分析。1、插入排序实现思想:确定一个有序的数组,将后续的元素逐一插入此有序数组,确定其相对位置,直到......
  • 【迅搜13】搜索技巧(三)排序与评分算法
    搜索技巧(三)排序与评分算法今天要学习的,第一部分是排序相关的功能,第二部分则是跟排序密切相关的另一块功能,评分算法。又是算法了,也就是说,又是一大块的理论知识了。今天的文章不长,因为我们的功能测试非常少,但却很重要,因为我们要讲到的理论算法是现在最主流的,也是各种搜索引擎的都在使......