●🧑个人主页:你帅你先说.
●📃欢迎点赞👍关注💡收藏💖
●📖既选择了远方,便只顾风雨兼程。
●🤟欢迎大家有问题随时私信我!
●🧐版权:本文由[你帅你先说.]原创,CSDN首发,侵权必究。
🍌简单选择排序基本思想及其代码实现
选择排序即每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。
🍊图解过程
每一趟排序都选出一个最小值放在前面,刚开始我们先假设最小的数是第一个
从这开始后面都比下标3对应的值大了,min不会再变了,再这里就不演示了。
第一趟排序找到min后与下标为
0
的数进行交换。
这样,一趟选择排序就完成了,第二趟排序找到最小值与下标为
1
的数进行交换,依次类推下去。
🥥动图演示:
🫐代码实现:
Swap(int* x,int* y){int tmp =*x;*x =*y;*y = tmp;}voidSelectSort(int* a,int n){int temp;for(i=0;i<n;i++){
min=i;for(j=i+1;j<n;j++){if(a[j]<a[min])
min=j;//将最小值的下标赋值给min}//交换最小值Swap(&a[min],&a[i]);}}
在这里我们要实现一种更优化的方式,上面这种一次交换一个值,而我们一次交换两个值,代码如下:
voidSelectSort(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)
🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊
觉得写的不错可以给个
一键三连
点赞👍关注💡收藏💖
🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊🍊
版权归原作者 你帅你先说. 所有, 如有侵权,请联系我们删除。