前言
选择排序是直观的排序,通过确定一个最大或最小值,再从待排序的的数中找出最大或最小的交换到对应位置。再选择次之。双重循环时间复杂度为 O(n^2)。简单选择排序是不稳定排序。
算法性能
时间复杂度: O(n^2),选择排序比冒泡排序快。
稳定性: 不稳定
代码实现
/*选择排序*/
#include <stdio.h>
void select_sort(int arr[],int n); //选择排序函数声明
int main()
{
int i = 0;
int arr[] = {2,4,6,8,0,1,3,5,7,9};
int n = sizeof(arr)/sizeof(arr[0]); //数组元素个数
select_sort(arr,n);
//打印排好顺序的数组
for(i=0;i<n;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
//选择排序函数定义
void select_sort(int arr[],int n)
{
int i,j,k,tmp;
for(i=0;i<n-1;i++) //n个元素需要排n-1趟
{
k = i; //确定一个最小值的下标
for(j=i+1;j<n;j++) //最小的与后面的相比,故j从i+1开始;循环比较到最后一位,故j<n
{
if(arr[k]>arr[j]) //若当前的最小值大于后面的
{
k = j; //重新确定最小值的下标
}
}
if(k != i) //经过一趟排序,K的值发生变化就交换
{
tmp = arr[k];
arr[k] = arr[i];
arr[i] = tmp;
}
}
}
程序运行结果
答疑解惑
1. 为什么选择排序不稳定呢?
答:假设有一个待排序的序列: 2 3 2 1 4
我们知道第一趟排序后就会选择第1个元素2和元素1交换,那么原来序列中两个2的相对顺序就被破坏了,所以选择排序是不稳定的排序算法。
2. 为什么要引入变量k呢?
答:变量k的作用是标记最小元素的下标,在出内循环后再交换两个元素的值,这样的好处是一趟排序可能只需要交换一次,运气好的好都不用交换了。这也是为什么选择排序比冒泡排序快。