一、 解决方案
给定数组:A = [5,3,7,2,1,9,8,4],对数组进行选择排序
每次循环都找到最小的数,放在前面。
将数组分为两个子集,排序的和未排序的,每一轮从未排序的子集中选出最小的元素,放入排序子集。重复以上步骤,直到整个数组有序。
第一轮选择,将最小的元素交换到索引为0的位置;
第二轮选择,将次小的元素交换到索引为1的位置;
以此类推……
二、代码
private static void selection(int[] a){
for (int i = 0; i < a.length - 1; i++) {
int s = i;
for(int j = i+1 ; j<a.length;j++){
if(a[j]<a[s]){
s = j;
}
}
if(s!=i){
swap(a,s,i);
}
}
}
三、与冒泡排序比较
- 一般情况下,选择排序快于冒泡,因为其交换次数少(每趟交换一次);
- 如果集合有度高,冒泡更快(如果冒泡索引为0,则停止);
- 冒泡属于稳定排序算法,而选择属于不稳定算法。
除非要排序的内容是一个复杂对象的多个数字属性,且其原本的初始顺序存在意义,那么我们需要在二次排序的基础上保持原有排序的意义,才需要使用到稳定性的算法
例如:本来是价格高到低,现在要保持价格高到低的顺序下,按销量高到低排序,稳定排序不会打乱。