选择排序介绍:
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始(末尾)位置,直到全部待排序的数据元素排完。选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。
排序算法的稳定性:
排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同
-
如果相同,则是稳定的排序方法。
-
如果不相同,则是不稳定的排序方法
举例:
如果排序前的数组是[3,3,1]
,假定我们使用选择排序的话,那第一趟排序后结果就是[1,3,3]
。这个数组有两个相同的值,它俩在array[0]
和array[1]
,结果经过排序,array[0]
的跑到了array[2]
上了。
那么这就导致:2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序不相同,因此,我们就说它是不稳定的
稳定性的好处:
如果我们只对一串数字排序,那么稳定与否确实不重要,因为一串数字的属性是单一的,就是数字值的大小。但是排序的元素往往不只有一个属性,例如我们对一群人按年龄排序,但是人除了年龄属性还有身高体重属性,在年龄相同时如果不想破坏原先身高体重的次序,就必须用稳定排序算法。
只有当在“二次”排序时不想破坏原先次序,稳定性才有意义。
http://www.cnblogs.com/codingmylife/archive/2012/10/21/2732980.html
选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法
选择排序的算法实现:
public class SelectionSort {
public static void main(String[] args) {
//记录当前趟数的最大值的角标
int pos ;
//交换的变量
int temp;
int[] arrays = {2, 5, 1, 3, 4};
//外层循环控制需要排序的趟数
for (int i = 0; i < arrays.length - 1; i++) {
//新的趟数、将角标重新赋值为0
pos = 0;
//内层循环控制遍历数组的个数并得到最大数的角标
for (int j = 0; j < arrays.length - i; j++) {
if (arrays[j] > arrays[pos]) {
pos = j;
}
}
//交换
temp = arrays[pos];
arrays[pos] = arrays[arrays.length - 1 - i];
arrays[arrays.length - 1 - i] = temp;
}
for (int i : arrays) {
System.out.println(i);
}
}
}
-
一个数组是需要
n-1
趟排序的(因为直到剩下一个元素时,才不需要找最大值) -
每交换1次,再次找最大值时就将范围缩小1
-
查询当前趟数最大值实际上不用知道最大值是多少,知道它的数组角标即可,交换也是根据角标来进行交换