选择排序改进了冒泡排序,将其交换次数从O(N 2) 减少到了O(N),但是比较的次数仍然为O(N2),即使这样,选择排序依然为大数据量的排序提出了一个非常重要的改进,减少了大量数据在内存中的交换次数。
talk is cheap ,show my code!
package javal.util.test;
public class SelectSort {
public static void main(String[] args) {
long[] array = new long[] {45,2,344,55,66,1,2234,54,6};
selectionSort(array);
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
public static void selectionSort(long[] array) {
int out,in,min,len=array.length;
for(out =0; out < len-1 ; out++) {
min = out;
for(in= out+1; in<len; in++) {
if(array[in] < array[min]) {
min = in;
}
}
long temp =array[out];
array[out] = array[min];
array[min] = temp;
}
}
}
选择排序几个注意点:
1. 外层for循环, 从数组的开始位置(第0位)开始,(即 比较当前位置的数据项与剩余数据项中最小值的大小)。到数组的最后一位(length-1)结束,每次循环起始位置向右移动一位。 每执行一次外循环,内循环的其实位置向右移动一位,这样下次循环就不会在处理小于out 的数据项,
2. 内层for循环 , 起始位置为外层for循环的起始位加1,因为要找出剩余数据项中最小的值来做比较。到length-1结束循环,程序中 因为length-1执行过一次,所以内层for循环的结束位为length. 内层for循环的目的就是找出 剩余数据项中的最小值。
3. 每经过一次内循环,都会找到一个剩余数据项中的最小值,然后和out位置的最小值 做比较,如果 小于out位置的数据项,则交换两个数据项的位置。
选择排序程序中的不变性为 下标小于out的数据项是有序的。