• 冒泡排序、选择排序、计数排序(C语言实现)


    🔆欢迎来到我的【数据结构】专栏🔆

    • 👋我是Brant_zero,一名学习C/C++的在读大学生。
    • 🌏️我的博客主页​​​​​​➡➡Brant_zero的主页
    • 🙏🙏欢迎大家的关注,你们的关注是我创作的最大动力🙏🙏

    🍁前言

            堆排序、希尔排序、快速排序、归并排序这几个BOSS过后,我们将剩下三个比较简单的排序再实现一下,总算把八大排序都学习完了~~~

    目录

    一、 冒泡排序

    二、 选择排序

    三、计数排序


    一、 冒泡排序

    冒泡排序算法的原理如下: 

    1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 

    2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素会是最大的数。 

    3. 针对所有的元素重复以上的步骤,除了最后一个。 

    4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 

    我们来看看下面的动图:

    1. void swap(int *a,int *b)
    2. {
    3. int temp = *a;
    4. *a = *b;
    5. *b = temp;
    6. }
    7. void BubbleSort(int* a, int n)
    8. {
    9. for (int i = 0; i < n - 1; i++)
    10. {
    11. int exchange = 1;
    12. for (int j = 0; j < n - 1 - i; j++)
    13. {
    14. if ( a[j + 1]< a[j])
    15. {
    16. swap(&a[j], &a[j + 1]);
    17. exchange = 0;
    18. }
    19. }
    20. if (exchange)
    21. break;
    22. }
    23. }

    二、 选择排序

    选择排序算法原理如下:

    1. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置

    2. 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

    3. 重复第二步,直到所有元素均排序完毕

    1. void swap(int *a,int *b)
    2. {
    3. int temp = *a;
    4. *a = *b;
    5. *b = temp;
    6. }
    7. void SelectSort(int* a, int n)
    8. {
    9. for (int i = 0; i < n-1; i++)
    10. {
    11. int temp = i;
    12. for (int j = i+1; j < n; j++)
    13. {
    14. if (a[j] < a[temp])
    15. {
    16. temp = j;
    17. }
    18. }
    19. swap(&a[temp], &a[i]);
    20. }
    21. }

    三、计数排序

    计数排序算法原理如下:

    1. 计算出当前数据集合的范围区间range,即最大值 - 最小值。
    2. 开辟range大小的计数表(使用calloc),记录每个数据出现的次数。
    3. 统计每个数出现的次数,放到减去最小值后其在计数表中的相对位置
    4. 回写数据。遍历计数表,如果表中位置不为零,则直接回写到元素组中,其值为下标 + 最小值,则可将相对位置转回为绝对位置。

    1. void CountSort(int* a, int n)
    2. {
    3. int max = a[0];
    4. int min = a[0];
    5. for (int i = 1; i < n; i++)
    6. {
    7. if (max < a[i])
    8. max = a[i];
    9. if (min > a[i])
    10. min = a[i];
    11. }
    12. int range = max - min+1;
    13. int* temp = (int*)calloc(range, sizeof(int));
    14. for (int i = 0; i < n; i++)
    15. {
    16. temp[a[i] - min]++;
    17. }
    18. //回写
    19. int j = 0;
    20. for (int i=0;i
    21. {
    22. while (temp[i]--)
    23. {
    24. a[j++] = i+min;
    25. }
    26. }
    27. }

  • 相关阅读:
    UE基础篇五:动画
    计算机基础学习(好文必看)
    如何使用Sentinel实现流控和降级
    【luogu P8326】Fliper(图论)(构造)(欧拉回路)
    数据库的约束
    LeetCode1 两数之和
    element下拉框样式
    在Flask中使用Jinjia2
    长文预警:一图胜千言!Python 数据可视化多维讲解
    二分算法(超详细)
  • 原文地址:https://blog.csdn.net/Brant_zero/article/details/125782333