《啊哈算法》学习笔记(C语言)(一)——排序

本文是《啊哈!算法》学习笔记的第一篇,主要介绍简易桶排序、冒泡排序、快速排序(1.0、2.0、3.0版本)和归并排序的基本思想及C语言实现。各种排序算法的时间复杂度和空间复杂度进行了分析,特别讨论了快速排序的空间效率和堆排序的空间复杂度优势。
摘要由CSDN通过智能技术生成

《啊哈!算法》学习笔记(一)——排序

开头

后续的几篇博客是对看完《啊哈算法》后的一个复习整理,书中对各类算法有一个思想和基本代码框架的介绍,对于算法们进一步的应用,相关的题目没有涉及。博客内容比较浅显。后续深入学习的,另会涉及题目

简易桶排序

#include <stdio.h>

int main()
{
    int a[1000] = {0};
    int t, i, j;
    int n;
    scanf("%d", &n); //输入有多少个数需要排序

    for (i = 0; i < n; i++)
    {
        scanf("%d", &t);
        a[t]++;
    }

    for (i = 0; i < 1000; i++)
        for (j = 0; j < a[i]; j++)
            printf("%d ", i);

    return;
}

巧妙之处:存储数的不是数组元素的值,而是数组元素的角标,元素的值用来记录该数出现了几次。

不足之处:如果需要排序的数非常大,那空间复杂度就很差,容易溢出;另外,因为是遍历整个数组,所以有很多无效遍历;最严重的是,如果需要排序的数为浮点数或者负数,上述排序就不适用了。

易错之处:如果说数的范围都在0~1000,设1000为m,一共有n个数要排序。那么它的时间复杂度不是O(nm),而是O(n+m),并不是每一次外循环都会完全遍历n次内循环,内部只遍历n次。

真正的桶排序并没有这么简单,它就能处理元素为浮点数的情况,此处不提。

冒泡排序_bubblesort

#include <stdio.h>

int Swap(int *e1, int *e2)
{
    int temp = *e1;
    *e1 = *e2;
    *e2 = temp;
}

int main()
{
    int a[1000] = {0};
    int n, i, j;

    scanf("%d", &n);
    for (i = 0; i < n; i++)
        scanf("%d", &a[i]);

    for (i = 0; i < n - 1; i++)//只用排n-1次,最后只剩下未归位的角标为0的第一个元素,已经排好。
        for (j = 0; j < n - 1 - i; j++)//别少-i,因为从后往前数共i个元素都是排好序的,不用遍历
        {
            if (a[j] > a[j + 1])
                Swap(&a[j], &a[j + 1]);
        }

    for (i = 0; i < n; i++)
        printf("%d ", a[i]);

    return 0;
}

特征:双重for循环遍历,初学较为常见,时间复杂度为O(N^2),因为是用数组元素的值来存储数值,所以可以对浮点型数据排序。

缺点:时间复杂度太高,大部分题目会超时。

描述:Donald E. Knuth&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值