选择排序
选择排序排序法也是一种比较简单的排序方法。选择二字就透露了其实现原理,选择待排数组中最小(或最大)的元素与数组的第一个元素交换,这就完成了第一次排序。紧接着第二次排序,选择剩下数组中(除去第一个元素)最小(或最大)的元素,将其与数组中(除去第一个元素)的第一个元素交换。第三次排序,选择剩下数组中(除去前两个元素)最小的元素,将其与数组中(除去第二个元素)的第一个元素交换。。。。。这样依次进行下去,便能够将数组排好序。这样看上去好像有点抽象,下面举个实际的例子:
举例
待排序列:{3,6,2,9,7,5}
第一次排序:2|6|3|9|7|5|
第二次排序:2|3|6|9|7|5|
第三次排序:2|3|5|9|7|6|
第四次排序:2|3|5|6|9|7|
第五次排序:2|3|5|6|7|9|
代码:
public void sort(int[] a) {
// TODO Auto-generated method stub
int N = a.length;
for(int i = 0; i < N; i++ ){
for(int j = i+1; j < N ; j ++ ){
int min = i;
if(less(a[j] , a[min]))
min = j;
exchange(a , min , i);
}
}
}
时间复杂度的讨论
由上面的例子以及代码可以看出,选择排序的交换次数为N,其主要的时间是花在比较大小上。其比较的次数为(N-1)+(N-2)+(N-3)+.....+2+1,所有比较次数大约为N^2/2。所以选择排序的时间复杂度为O(n^2)。
稳定性
举一个简单的例子就能够看出选择排序法的稳定性。排序{6,6,4},当第一次排序时,4和第一个6交换,导致第一个6换到了第二个6的后面,所有选择排序是不稳定的
选择排序和冒泡排序的时间消耗
因为选择排序的时间主要消耗在比较元素大小上,而冒泡排序的时间主要是花在元素的交换上。因为交换比比较大小所花的时间稍长一些,所以选择排序法的效率比冒泡排序的效率稍高一点。