排序算法——选择排序
简介
选择排序(Selection sort)是一种简单直观但不稳定的排序算法,思路是从待排序数组中依次挑选出最大(小),次大(小),第三大(小),……,第 N 大(小)的元素,依次排列后完成排序
原理
将数组分成已排序和未排序部分,初始状态已排序部分不存在元素,所有元素均在未排序部分。以升序为例,遍历未排序部分获取最小值,将其与未排序部分的首位元素交换位置,然后将该首位元素归为已排序部分,不断遍历,直到未排序部分仅剩一个元素时,便视为排序完成
以升序为例,待排序序列为 2 7 4 5 6,红字为每次遍历查找到的最小值元素位置,蓝底为已排序部分,灰底为未排序部分
代码实现
1 #include<stdio.h> 2 int main() 3 { 4 int n,a[50];//n是元素个数 a是数组 5 6 int min_t;//min_t用于记录最大值元素位置 7 int i,j;//i,j用于循环遍历 8 9 /*读入元素*/ 10 scanf("%d",&n); 11 for(i=0;i<n;i++) scanf("%d",&a[i]); 12 13 /*选择排序*/ 14 for(i=0;i<n-1;i++) 15 { 16 /*挑选最小元素*/ 17 min_t=i; 18 for(j=i+1;j<n;j++) 19 { 20 /*升序*/ 21 if(a[j]<a[min_t]) 22 min_t=j; 23 /*降序排列只需将上面的 < 改为 > 即可*/ 24 } 25 26 /*最小元素与首位元素交换*/ 27 int temp; 28 temp=a[i]; 29 a[i]=a[min_t]; 30 a[min_t]=temp; 31 32 } 33 34 /*输出排序后的元素*/ 35 for(i=0;i<n;i++) printf("%d ",a[i]); 36 return 0; 37 }
稳定性
选择排序并不是稳定的排序算法,原因是在交换元素的过程中无形中有可能会改变相同元素的相对位置,但根据代码不同,对于不同的待排序序列,是否改变相对位置会因代码实现而异
以我上面的升序排序代码为例,若待排序元素为 5 1 1*( * 号仅用于区分相同元素),每次遍历后数组各位置元素为
可以发现,本应位于 1 后面的 1* ,在排序完成后移动到了 1 的前面,原因是在交换 5 与 1* 的过程中改变了 1 和 1* 的相对位置,导致排序不稳定
时间复杂度
对于 N 个元素的数组,至少需要遍历 N - 1 次才能够完成排序,而第 i 次遍历需要遍历 N - i + 1 个元素,所以需要遍历的元素总个数为
时间复杂度为 O( N² )