排序算法总结—时间复杂度O(n)—基数排序/计数排序小记

简介: 排序算法总结—时间复杂度O(n)—基数排序/计数排序小记

排序算法总结—时间复杂度O(n)—基数排序


f89488d50bcb4585a83ebd029a5a4243.jpg


基数排序


分为最高位优先和最低位优先的算法。

找到最大值max,求出max的位数。在max位数max—length进行循环max-length趟。对于每一位进行排序,对于一个数字要会从低位一位一位取值,合理使用/10,%10。

(对于大于0的数据范围,通常是10位,如果数据中有负数,要取19位。

开辟一个计数数组count,对于出现几次就对应的数字count+1。

count对应的直接就是该数字对应的下标(后序放入数组),当后序放入数组时,我们将同样的数字对应的count值-1,便于存储下一个同样的数字,不会冲突或溢出。

下面有一个前序放入的计数排序代码,count值++操作;


以王道书为主:


时间复杂度 O(d(n+r)) d趟分配和收集,一趟分配O(n),一趟收集O(r)

空间复杂度(书中是采用了r个队列)O(r)

稳定 稳定!老稳了!🌸

void copy(int arr[],int nums[],int len)
{
    for(int i = 0;i < len;i++)
    {
        nums[i] = arr[i];
    }
}
void set_0(int arr[],int len)
{
    for(int i = 0;i < len;i++)
    {
        arr[i] = 0;
    }
}
int maximumGap(int* nums, int numsSize){
    if(numsSize < 2) return 0;
    int cha = 0;
    int max = 0,max_length = 0;
    int count[10];
    int arr[numsSize];
    int ten = 1;
    set_0(arr,numsSize);
    for(int i = 0;i < numsSize;i++)
    {
        if(max < nums[i])
        {
            max = nums[i];
        }
    }
    while(max > 0)
    {
        max = max / 10;
        max_length++;
    }
    set_0(count,10);
    while(max_length--)
    {
        for(int j = 0;j < numsSize;j++)
        {
            int r = nums[j] / ten % 10;
            count[r]++;
        }
        for(int k = 1;k < 10;k++)
        {
            count[k] += count[k-1];
        }
        for(int m = numsSize-1;m >= 0;m--)
        {
            int r = nums[m] / ten % 10;
            arr[count[r]-1] = nums[m];
            count[r]--;
        }
        copy(arr,nums,numsSize);
        ten *= 10;
        set_0(count,10);
    }
    for(int k = 0; k < numsSize-1;k++)
    {
        if(cha < nums[k+1]-nums[k])
        {
            cha = nums[k+1] - nums[k];
        }
    }
    return cha;
}

我们可以了解一个计数排序的基础:

了解最大值 最小值作用 统计一个数出现n次,直接排位置。

也leetcode 排序数组例题为例。

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* sortArray(int* nums, int numsSize, int* returnSize){
    *returnSize = numsSize;
    int max = nums[0];
    int min = nums[0];
    for(int i = 0;i < numsSize;i++)
    {
        if(max < nums[i])
            max = nums[i];
        if(min > nums[i])
            min = nums[i];
    }
    // printf("%d %d",min,max);
    int elemSize = max-min + 1;
    int count[elemSize]; //计数数组
    for(int i = 0;i < elemSize;i++)
    {
        count[i] = 0;
    }
    for(int j = 0;j < numsSize;j++)
    {
        count[nums[j]-min]++; //计数 有几个相同的数字
    }
    int precount = 0;
    for(int i = 0;i < elemSize;i++)
    {
        precount += count[i];
        count[i] = precount - count[i];
        // printf("%d ",count[i]);
    }
    int *returns = (int*)malloc(sizeof(int )* numsSize);
    for(int k = 0;k < numsSize;k++)
    {
        returns[count[nums[k]-min]] = nums[k];
        count[nums[k]-min]++;
    }
    return returns;
}

撒花,再撒,嘿嘿

7f9d97b581574010a7cf02c5b999c5b2.png

相关文章
|
2月前
|
机器学习/深度学习 缓存 算法
Python算法设计中的时间复杂度与空间复杂度,你真的理解对了吗?
【10月更文挑战第4天】在Python编程中,算法的设计与优化至关重要,尤其在数据处理、科学计算及机器学习领域。本文探讨了评估算法性能的核心指标——时间复杂度和空间复杂度。通过详细解释两者的概念,并提供快速排序和字符串反转的示例代码,帮助读者深入理解这些概念。同时,文章还讨论了如何在实际应用中平衡时间和空间复杂度,以实现最优性能。
79 6
|
4月前
|
机器学习/深度学习 算法 程序员
读《趣学算法》:重开算法之门,时间复杂度与空间复杂度
本文是作者阅读《趣学算法》后的笔记,介绍了算法复杂度的基本概念,包括时间复杂度和空间复杂度的不同阶表示,并通过具体例子展示了如何计算和理解算法的效率。
70 2
读《趣学算法》:重开算法之门,时间复杂度与空间复杂度
|
2月前
|
搜索推荐 算法
插入排序算法的平均时间复杂度解析
【10月更文挑战第12天】 插入排序是一种简单直观的排序算法,通过不断将未排序元素插入到已排序部分的合适位置来完成排序。其平均时间复杂度为$O(n^2)$,适用于小规模或部分有序的数据。尽管效率不高,但在特定场景下仍具优势。
|
5月前
|
机器学习/深度学习 存储 算法
颠覆认知!Python算法设计中的时间复杂度与空间复杂度,你真的理解对了吗?
【7月更文挑战第22天】在Python算法设计中,时间与空间复杂度是评估算法效能的核心。时间复杂度不仅限于大O表示法,还涵盖平均与最坏情况分析。空间复杂度虽关注额外存储,但也反映内存效率。平衡二者需视场景而定,如利用原地算法减少内存消耗,或牺牲空间加速执行。算法优化技巧,如分治与动态规划,助你在资源与速度间找寻最优解,从而高效应对大数据挑战。
57 3
|
2月前
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
41 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
|
2月前
|
算法 搜索推荐 Java
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
基数排序是一种稳定的排序算法,通过将数字按位数切割并分配到不同的桶中,以空间换时间的方式实现快速排序,但占用内存较大,不适合含有负数的数组。
41 0
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
|
2月前
|
搜索推荐 Java Go
深入了解计数排序算法
深入了解计数排序算法
45 4
|
2月前
|
搜索推荐 Java Go
深入了解基数排序算法
深入了解基数排序算法
35 3
|
2月前
|
存储 算法
算法的时间复杂度和空间复杂度
本文详细讨论了算法的时间复杂度和空间复杂度,包括它们的概念、计算方法和常见复杂度的对比,并通过多个实例解释了如何计算算法的时间和空间复杂度。
159 0
算法的时间复杂度和空间复杂度
|
3月前
|
算法 Python
震惊!Python 算法设计背后,时间复杂度与空间复杂度的惊天秘密大起底!
在 Python 算法设计中,理解并巧妙运用时间复杂度和空间复杂度的知识,是实现高效、优雅代码的必经之路。通过不断地实践和优化,我们能够在这两个因素之间找到最佳的平衡点,创造出性能卓越的程序。
42 4