[转载] 百度百科
1、拟解决问题
输入
n个数的序列<a1,a2,a3,...,an>。
输出
原序列的一个重排<a1*,a2*,a3*,...,an*>;,使得a1*<=a2*<=a3*<=...<=an*
2、选择排序的思想
1)、假定第一个元素是最小值,依次 和其它每个元素比较,最终找到最小数,用变量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)、堆排序类似于选择排序。它是利用了最大堆的性质——父亲要大于等于孩子的值,所以根节点是最大值,每次就选择根节点元素放到正确的位置。