排序算法(1)——选择排序

来源:互联网 发布:算法 编辑:程序博客网 时间:2024/06/09 15:59

[转载] 百度百科

1、拟解决问题

输入

n个数的序列<a1,a2,a3,...,an>。

输出

原序列的一个重排<a1*,a2*,a3*,...,an*>;,使得a1*<=a2*<=a3*<=...<=an*

2、选择排序的思想

1)、对比数组中前一个元素跟后一个元素的大小,如果后面的元素比前面的元素小则用一个变量k来记住他的位置,接着第二次比较,前面“后一个元素”现变成了“前一个元素”,继续跟他的“后一个元素”进行比较如果后面的元素比他要小则用变量k记住它在数组中的位置(下标),等到循环结束的时候,我们应该找到了最小的那个数的下标了;
2)、然后进行判断,如果这个元素的下标不是第一个元素的下标,就让第一个元素跟他交换一下值,这样就找到整个数组中最小的数了。
3)、然后找到数组中第二小的数,让他跟数组中第二个元素交换一下值,以此类推。

3、选择排序的实现

/* 选择排序 */void select_sort(int*a,int n){    int i,j,min,t;    for(i=0;i<n-1;i++)    {        min=i;//查找最小值        for(j=i+1;j<n;j++)            if(a[min]>a[j])                min=j;        if(min!=i)//判断当前元素是否是就最小值        {            t=a[min];            a[min]=a[i];            a[i]=t;        }    }}

4、选择排序的性能

1、时间复杂度

交换操作次数介于 0 ~ (n - 1) 。最好情况是,已经有序,交换0次;最坏情况交换n-1次;逆序要交换n/2次。

赋值操作次数是交换操作次数的3倍,介于 0 ~ 3 (n - 1) 之间。

比较操作次数次数与关键字的初始状态无关,都是N=(n-1)+(n-2)+…+1=n*(n-1)/2,即满足 O(n^2)。

2、稳定性

如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。
比较拗口,举个例子,序列5 8 5 2 9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中两个5的相对前后顺序就被破坏了,所以选择排序是一个不稳定的排序算法。

和其它排序算法比较:
1)、选择排序比冒泡排序的交换次数少多了,由于交换所需的CPU时间 比 比较所需的CPU时间多,所以选择排序比冒泡排序快(n值较小时?还是无论n大小都是?)。
2)、堆排序类似于选择排序。它是利用了最大堆的性质——父亲要大于等于孩子的值,所以根节点是最大值,每次就选择根节点元素放到正确的位置。

0 0
原创粉丝点击