• 【排序算法】冒泡、选择、插入排序算法比较


    冒泡排序

    思路:
    1. 有序比较两个元素,将较大的元素放到数组末尾。
    2. 循环比较到最后一个元素,此时,这一轮比较出来最大的数就在数组末尾。
    3. 重复上述步骤,直到没有需要比较的元素。

    代码:

    1. public int[] BubbleSort(int[] array)
    2.     {
    3.         for (int i = 1; i < array.Length; i++)
    4.         {
    5.             bool _change = false;
    6.             for (int j = 0; j < array.Length - i; j++)
    7.             {
    8.                 if (array[j] > array[j + 1])
    9.                 {
    10.                     int _num = array[j];
    11.                     array[j] = array[j + 1];
    12.                     array[j + 1] = _num;
    13.                     _change = true;
    14.                 }
    15.             }
    16.             if (!_change)
    17.             {
    18.                 break;
    19.             }
    20.         }
    21.         return array;
    22.     }


    性能分析:
    时间复杂度是 O(N²),假设数据是随机的,平均交换次数为 N²/4。如果初始数据是逆序的,那么每次比较都要交换位置,交换次数为 N²。

    选择排序

    思路:
    1. 从所有元素中选出最小的元素,将最小的元素放在数组第一位。
    2. 从余下的元素中找出最小元素,放在数组第二位。
    3. 循环选择到排序结束。

    代码:

    1. public int[] ChoiceSort(int[] array)
    2.     {
    3.         for (int i = 0; i < array.Length - 1; i++)
    4.         {
    5.             int _min = i;
    6.             for (int j = i + 1; j < array.Length; j++)
    7.             {
    8.                 if (array[j] < array[_min])//查找最小值的index
    9.                 {
    10.                     _min = j;
    11.                 }
    12.             }
    13.             if (i != _min)//替换最小值
    14.             {
    15.                 int _temp = array[i];
    16.                 array[i] = array[_min];
    17.                 array[_min] = _temp;
    18.             }
    19.         }
    20.         return array;
    21.     }


    性能分析:
    时间复杂度是 O(N²),至多进行了N次交换。

    插入排序

    思路:
    1. 将数组分成已排序和未排序两份。
    2. 循环待排序部分,将取出的元素插入到前面已经排好的部分中去。

    代码:

    1.  public int[] InsertSort(int[] array)
    2.     {
    3.         int j;
    4.         for (int i = 1; i < array.Length; i++)
    5.         {
    6.             int _temp = array[i];
    7.             j = i;
    8.             while (j > 0 && _temp < array[j - 1])
    9.             {
    10.                 array[j] = array[j - 1];
    11.                 j--;
    12.             }
    13.             array[j] = _temp;
    14.         }
    15.         return array;
    16.     }


    性能分析:
    时间复杂度是 O(N²),赋值的次数大致等于比较的次数,但是一次赋值与一次交换的时间耗时不同,所以相对于随机数据,插入排序比冒泡快一倍,比选择排序略快。

    总结:

    - 冒泡、选择、插入时间复杂度都是 O(N²)。一般不会选择冒泡排序,虽然冒泡排序书写是最简单的,但是平均性能是没有选择排序和插入排序好的。
    - 选择排序把交换次数降低到最低,但是比较次数还是挺大的。当数据量小,并且交换数据相对于比较数据更加耗时的情况下,可以应用选择排序。
    - 在大多数情况下,假设数据量比较小或基本有序时,插入排序是三种算法中最好的选择。

  • 相关阅读:
    php的短信验证的流程,如何实现前端js加后端php
    kubernetes集群yaml文件与kubectl工具
    Liunx文件操作命令(touch、cat、vim、more、less、cp、mv、rm、head、tail、file、find)
    【GPT引领前沿】GPT4技术与AI绘图
    扫盲低代码——构建的基本原理
    极速安装kubernetes-1.22.0(三台CentOS7服务器)
    学习编程只需要这三条建议!
    Web3究竟红在哪里,它的出现能为人类社会带来什么?
    java毕业设计花漾网在线商城(附源码、数据库)
    【附源码】Python计算机毕业设计民宿网站管理系统
  • 原文地址:https://blog.csdn.net/qq_33461689/article/details/125636683