上次讲了冒泡排序及其优化,可以发现每一次排序的是时候都要交换元素位置好几次,虽然算法稳定,但是频繁交换元素消耗系统资源,性能并不是很佳。是不是还有比冒泡排序快的排序方法呢?当然有,还不止一种,本节将谈到其中一种---》选择排序。
选择排序的思想:每一次排序找出最小的(或者最大的)元素与此次参与排序的第一个(或者最后一个)元素交换位置,直至排序成功。以找正序排序为例:每次寻找只需要比较找出小大元素的索引,然后再跟此次参与排序的第一个元素交换位置,每次排序只交换一次位置,这样避免了冒泡排序大量交换元素位置的缺点。
举例: 5,4,3,2,1
第一次排序: 1,4,3,2,5
第二次排序: 1,2,3,4,5 -----》已正序,虽然已经正序,但是根据选择排序的特性,无法判断是否已经正序,所以还得继续往下循环(只循环判断,不用交换元素位置) ---》虽然无效的循环判断浪费了一点性能,但是综合来讲比冒泡排序快
优化后代码如下:(正序)
public void selectionSort(int[] sort) {
int temp;
for (int i=0;i<sort.length-1;i++) {
int minSize = i;
for(int j=i+1;j<sort.length;j++) {
if(sort[minSize]>sort[j]) {
minSize = j;
}
}
if(minSize != i) {
temp = sort[i];
sort[i] = sort[minSize];
sort[minSize] = temp;
}
}
}
虽然优化后选择排序是比优化后冒泡排序快点,但是它的缺点是算法不稳定,比如:5,2,5,1,6 第一次交换时第一个5挪到了第二个5后面了,相同项在排序后的次序被变化了,所以算法时不稳定的。