文章目录
- 一、选择排序思想
- 二、排序过程详解
- 2.1 排序的次数
- 2.2 排序演示
- 三、代码范例
- 3.1 SelectSort函数
- 3.2 整体代码实现
- 3.3 结果展示
- 四、选择排序分析
- 4.1 稳定性
- 4.2 复杂度
- 4.3适用场景
- 五、选泽排序优化
- 总结
一、选择排序思想
选择排序(Selection sort)是一种比较简单直观的排序算法。它的工作原理是:.每次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到待排序的数据元素的个数排完为止。
二、排序过程详解
2.1 排序的次数
因为每排好一个元素,那么所需要排的元素个数减一,直到排到倒数第二个元素停止,将倒数第二个元素也排好后,整体数组排序就完成了。所以 排序的次数 = 元素个数 - 1。
2.2 排序演示
eg:原始值:5,2,8,6,1
第一次:先找到该数列中最小值,然后与数列中第一个元素交换
// 交换后:1,2,8,6,5
第二次:从第二项开始查找,未排序列中的最小值,再与第二项元素交换位置
// 交换后:1,2,8,6,5
第三次:从第三项开始查找
// 交换后:1,2,5,6,8
第四次:从第四项开始查找
// 交换后:1,2,5,6,8
三、代码范例
3.1 SelectSort函数
void SelectSort(int* a, int length)//简单选择排序算法实现
{
for (int i = 0; i < length; ++i)
{
int min = i;//min记录最小值
for (int j = i + 1; j < length; ++j)//遍历确定最小值
{
if (a[j] < a[min])
min = j;
}
if (min != i)//交换最小值与待排序列第一个位置
{
int temp = a[i];
a[i] = a[min];
a[min] = temp;
}
}
}
3.2 整体代码实现
#include<stdio.h>
void SelectSort(int* a, int length)//简单选择排序算法实现
{
for (int i = 0; i < length; ++i)
{
int min = i;
for (int j = i + 1; j < length; ++j)
{
if (a[j] < a[min])
min = j;
}
if (min != i)
{
int temp = a[i];
a[i] = a[min];
a[min] = temp;
}
}
}
int main()
{
int a[10] = { 14,23,52,15,25,3,6,8,72,45 };
int length = sizeof(a) / sizeof(a[0]);
printf("排序前:\n");
for (int i = 0; i < length; i++)
{
printf("%d ", a[i]);
}
printf("\n");
SelectSort(a, length);
printf("排序后:\n");
for (int i = 0; i < length; i++)
{
printf("%d ", a[i]);
}
return 0;
}
3.3 结果展示
四、选择排序分析
4.1 稳定性
在选择排序中,每趟都会选出最大元素或最小元素,然后与顶端元素交换,此时,待排序序列中如果存在与原来两端元素相等的元素,稳定性就可能被破坏。如[5,3,5,2,9],在array[0]与array[3]元素交换时,序列的稳定性就被破坏了,所以选择排序是一种不稳定的排序算法。
4.2 复杂度
选择排序的时间复杂度为O(n^2)。
选择排序的空间复杂度为O(1)。
4.3适用场景
待排序序列中,元素个数较少时。
五、选泽排序优化
选择排序的优化思路一般是在一趟遍历中,同时找出最大值与最小值,放到数组两端,这样就能将遍历的趟数减少一半。第一次选择最大值与最小值。
这里博主偷个懒,就留给大家去实现代码实例吧!!
总结
欢迎关注博主,博主会在第一时间去更新排序的有关问题以及c/java中的其他有关知识,望大家支持!!一起进步