【每日算法】选择排序算法之直接选择排序
1)算法简介
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下:
- 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置;
- 然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
- 以此类推,直到所有元素均排序完毕。
2)算法描述和分析
n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:
1、初始状态:无序区为R[1..n],有序区为空。
2、第i趟排序(i=1,2,3...n-1)
第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
3、前n-1趟结束,数组有序化了
选择排序的交换操作介于0和(n-1)次之间。选择排序的比较操作为n(n-1)/2次之间。选择排序的赋值操作介于0和3(n-1)次之间。比较次数O(n^2),比较次数与关键字的初始状态无关,总的比较次数N=(n-1)+(n-2)+...+1=n*(n-1)/2。 交换次数O(n),最好情况是,已经有序,交换0次;最坏情况是,逆序,交换n-1次。 交换次数比冒泡排序少多了,由于交换所需CPU时间比比较所需的CPU时间多,n值较小时,选择排序比冒泡排序快。
最差时间复杂度 О(n²)
最优时间复杂度 О(n²)
平均时间复杂度 О(n²)
最差空间复杂度 О(n) total, O(1)
3)算法图解、flash演示、视频演示
图解:
Flash:
http://ds.fzu.edu.cn/fine/resources/FlashContent.asp?id=85
视频:选择排序Select Sort排序舞蹈
http://v.youku.com/v_show/id_XMjU4NTY5NTcy.html
4)算法代码
void selection_sort(int *a, int len)
{
register int i, j, min, t;
for(i = 0; i < len - 1; i ++)
{
min = i;
//查找最小值
for(j = i + 1; j < len; j ++)
if(a[min] > a[j])
min = j;
//交换
if(min != i)
{
t = a[min];
a[min] = a[i];
a[i] = t;
}
}
}
5)考察点,重点和频度分析
就博主看过的笔试面试题而言,选择算法也大多出现在选择填空中,要熟悉其时间和空间复杂度,最好最坏的情况分别是什么,以及在那种情况下,每一轮的比较次数等。
6)笔试面试例题
例题1、在插入和选择排序中,若初始数据基本正序,则选用 插入排序(到尾部) ;若初始数据基本反序,则选用 选择排序 。
例题2、 下述几种排序方法中,平均查找长度(ASL)最小的是
A. 插入排序 B.快速排序 C. 归并排序 D. 选择排序