王剑编程网

分享专业编程知识与实战技巧

C语言的十大组数排序法:选择排序!竟然可以这么快!

情景回顾

上节回顾:C语言的十大组数之冒泡排序法的应用

本节重点

本节重点:C语言的十大组数排序法:选择排序!竟然可以这么快!


关注不迷路

微信公众号:工控小新

学习工控知识就来工控小新,为你提供工控笔记知识:EPLAN电气绘图 | TIA博图基础 | CAD | C语言教学 | 单片机基础 | 三菱PLC ... 每日持续更新中


选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n^2) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。

本文将介绍选择排序的原理、实现和优缺点,以及如何用C语言编写选择排序的代码。

选择排序的原理

选择排序的基本思想是,首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。

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

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

例如,给定一个数组 arr = [9, 6, 15, 4, 2],我们要对它进行升序排序,那么选择排序的过程如下:

  • 第一轮,从 arr[0] 到 arr[4] 中找到最小的元素 arr[4] = 2,将它与 arr[0] 交换,得到 arr = [2, 6, 15, 4, 9]。
  • 第二轮,从 arr[1] 到 arr[4] 中找到最小的元素 arr[3] = 4,将它与 arr[1] 交换,得到 arr = [2, 4, 15, 6, 9]。
  • 第三轮,从 arr[2] 到 arr[4] 中找到最小的元素 arr[3] = 6,将它与 arr[2] 交换,得到 arr = [2, 4, 6, 15, 9]。
  • 第四轮,从 arr[3] 到 arr[4] 中找到最小的元素 arr[4] = 9,将它与 arr[3] 交换,得到 arr = [2, 4, 6, 9, 15]。

此时,所有元素已经排序完毕,选择排序结束。

选择排序的实现

要用C语言实现选择排序,我们需要定义一个函数,接受一个数组和它的长度作为参数,然后对数组进行选择排序。我们还需要定义一个辅助函数,用来交换两个元素的值。代码如下

// 交换两个元素的值
void swap(int *a, int *b) 
{
    int temp = *a;
    *a = *b;
    *b = temp;
}


// 选择排序
void selection_sort(int arr[], int n) 
{
    // i 表示已排序序列的末尾
    for (int i = 0; i < n - 1; i++) 
    {
        // min_index 表示未排序序列中最小元素的下标
        int min_index = i;
        // j 用来遍历未排序序列,寻找最小元素
        for (int j = i + 1; j < n; j++) 
        {
            // 如果找到比当前最小元素更小的元素,更新 min_index
            if (arr[j] < arr[min_index]) 
            {
                min_index = j;
            }
        }
        // 将最小元素与已排序序列的末尾交换
        swap(&arr[i], &arr[min_index]);
    }
}

选择排序的优缺点

选择排序的优点是:

  • 简单易懂,实现容易。
  • 不占用额外的内存空间,是一种原地排序算法。
  • 交换次数较少,最多进行 n - 1 次交换。

选择排序的缺点是:

  • 时间复杂度较高,无论数据是否有序,都需要进行 O(n^2) 次比较。
  • 不稳定,即相同的元素可能会改变原来的相对顺序。

总结

选择排序是一种简单直观的排序算法,它的基本思想是,每次从未排序序列中找到最小(大)元素,放到已排序序列的末尾,直到所有元素均排序完毕。选择排序的时间复杂度是 O(n^2),空间复杂度是 O(1),交换次数是 O(n),是一种不稳定的原地排序算法。选择排序适合数据规模较小的情况,如果数据规模较大,可以考虑其他更高效的排序算法。

#头条创作挑战赛#

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言