【每日算法】选择排序算法之直接选择排序

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. 选择排序

原文地址:https://www.cnblogs.com/shih/p/6637672.html