排序算法 - 直接选择排序

简介: 排序算法 - 直接选择排序

什么是直接选择排序?

直接选择排序(Selection Sort)是一种简单直观的排序算法。它的基本思想是每次在未排序的元素中选择最小(或最大)的元素,把它放到已排序的末尾(或开头)位置,直到所有元素都排好序。直接选择排序是一种不稳定的排序算法。其时间复杂度为 O(N^2)

算法步骤:

1. 从待排序序列中,找到关键字最小的元素;
2. 如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换;
3. 从剩下的 N-1 个元素中,找到关键字最小的元素;
4. 重复步骤2、3,直到排序结束。

例如,对 [5, 3, 8, 6, 4] 进行直接选择排序,排序过程如下:

第一次排序:找到最小元素 3,与第一个元素 5 交换位置,序列变为 [3, 5, 8, 6, 4];

第二次排序:找到最小元素 4,与第二个元素 5 交换位置,序列变为 [3, 4, 8, 6, 5];

第三次排序:找到最小元素 5,与第三个元素 8 交换位置,序列变为 [3, 4, 5, 6, 8];

第四次排序:找到最小元素 6,与第四个元素 8 交换位置,序列变为 [3, 4, 5, 6, 8];

第五次排序:序列已经有序,排序结束。

最终得到的有序序列为 [3, 4, 5, 6, 8]。

直接选择排序有啥用呢?

虽然直接选择排序并不是最快的排序算法,但它有以下几个优点:

  1. 简单直观:直接选择排序的实现非常简单,易于理解和实现。
  2. 内存消耗小:直接选择排序算法的内存消耗较小,不需要额外的空间。
  3. 对小规模数据排序效率高:当数据量较小的时候,直接选择排序的效率比较高,因为它只需要比较n-1次(n为数据的个数)。
  4. 不会损坏原始序列的稳定性:直接选择排序不会改变两个相等元素的相对位置,因此是一种稳定的排序算法。

直接选择排序的算法的实现

void Swap(int* a, int* b)
{
  int tmp = *a;
  *a = *b;
  *b = tmp;
}
//直接选择排序
void SelectSort(int* arr, int n)
{
  int i=0, j=0,mini=0;
  for (i = 0; i < n - 1; i++)//对n个元素排序,则需要进行n-1次排序
  {
    mini = i;//排完一次后最小值在最前面,最小值的位置随着i的变化而变化
    for (j = i+1; j < n; j++)//开始进行选择排序,因为[0 - i]已经有序了,所以从下标为i+1开始
    {
      if (arr[j] < arr[mini])
      {
        mini = j;//将较小值的下标赋给mini
      }
    }
    Swap(&arr[mini], &arr[i]);//将每次循环的较小值移到i位置,i从0开始,
    //当i=n-1时就结束循环,此时就已经排好序了
  }
}

直接选择排序的总结

综上所述,直接选择排序虽然不是最优秀的排序算法,但它具有简单直观,内存消耗小、对小规模数据排序效率高和不会损坏原始序列的稳定性等优点,因此仍然是一个比较实用的排序算法。

相关文章
|
1月前
|
算法 搜索推荐
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
本文介绍了冒泡排序、选择排序和插入排序三种基础排序算法的原理、实现代码和测试结果。
16 0
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
|
1月前
|
搜索推荐 Java Go
深入了解选择排序算法
深入了解选择排序算法
18 4
|
1月前
|
搜索推荐 算法
【排序算法(一)】——插入排序,选择排序 —> 深层解析
【排序算法(一)】——插入排序,选择排序 —> 深层解析
|
1月前
|
算法 Python
Python算法编程:冒泡排序、选择排序、快速排序
Python算法编程:冒泡排序、选择排序、快速排序
|
3月前
|
搜索推荐 算法 Java
经典排序算法之-----选择排序(Java实现)
这篇文章通过Java代码示例详细解释了选择排序算法的实现过程,包括算法的基本思想、核心代码、辅助函数以及测试结果,展示了如何通过选择排序对数组进行升序排列。
经典排序算法之-----选择排序(Java实现)
|
5月前
|
机器学习/深度学习 算法 搜索推荐
数据结构算法--2 冒泡排序,选择排序,插入排序
**基础排序算法包括冒泡排序、选择排序和插入排序。冒泡排序通过相邻元素比较交换,逐步将最大值“冒”到末尾,平均时间复杂度为O(n^2)。选择排序每次找到剩余部分的最小值与未排序部分的第一个元素交换,同样具有O(n^2)的时间复杂度。插入排序则类似玩牌,将新元素插入到已排序部分的正确位置,也是O(n^2)复杂度。这些算法适用于小规模或部分有序的数据。**
|
5月前
|
搜索推荐
排序算法---选择排序-----详解&&代码
排序算法---选择排序-----详解&&代码
|
5月前
|
算法 搜索推荐
数据结构与算法-选择排序
数据结构与算法-选择排序
30 4
|
5月前
|
搜索推荐 算法
【C/排序算法】:堆排序和选择排序
【C/排序算法】:堆排序和选择排序
34 0
|
5月前
|
算法 搜索推荐 Java
JavaSE——算法(1/2):认识、冒泡排序、选择排序及优化(介绍、详细图解、代码)
JavaSE——算法(1/2):认识、冒泡排序、选择排序及优化(介绍、详细图解、代码)
34 0