●🧑个人主页:你帅你先说.
●📃欢迎点赞👍关注💡收藏💖
●📖既选择了远方,便只顾风雨兼程。
●🤟欢迎大家有问题随时私信我!
●🧐版权:本文由[你帅你先说.]原创,CSDN首发,侵权必究。
🍌简单选择排序基本思想及其代码实现
选择排序即每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。
🍊图解过程
每一趟排序都选出一个最小值放在前面,刚开始我们先假设最小的数是第一个
从这开始后面都比下标3对应的值大了,min不会再变了,再这里就不演示了。
第一趟排序找到min后与下标为0
的数进行交换。
这样,一趟选择排序就完成了,第二趟排序找到最小值与下标为1
的数进行交换,依次类推下去。
🥥动图演示:
🫐代码实现:
void SelectSort(int* a, int n)
{
int temp;
for(i = 0;i < n;i++)
{
int min = i;
for(j = i+1;j < n;j++)
{
if(a[j] < a[min])
min = j;//将最小值的下标赋值给min
}
//交换最小值
swap(a[min],a[i]);
}
}
在这里我们要实现一种更优化的方式,上面这种一次交换一个值,而我们一次交换两个值,代码如下:
void SelectSort(int* a, int n)
{
int begin = 0,
int end = n - 1;
while (begin < end)
{
int mini = begin, maxi = begin;
for (int i = begin; i <= end; i++)
{
if (a[i] < a[mini])
mini = i;
if (a[i] > a[maxi])
maxi = i;
}
swap(a[begin], a[mini]);
// begin == maxi时,最大被换走了,修正一下maxi的位置
if (begin == maxi)
maxi = mini;
swap(a[end], a[maxi]);
begin++;
end--;
}
}
对于代码中的修正maxi部分,我给大家举个例子就懂了。
你会发现交换了个寂寞 你会发现交换回原来的位置
很明显选择排序的时间复杂度是:O(
N
2
N^2
N2)
最好时间复杂度:O(
N
2
N^2
N2)
最坏时间复杂度:O(
N
2
N^2
N2)
整体而言最差的排序,因为无论什么情况都是O(
N
2
N^2
N2)
🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊
觉得写的不错可以给个一键三连
点赞👍关注💡收藏💖
🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊