1.基本思想
选择排序是指在数组A[n]中,刚开始有序数组中个数为0,首先遍历整个数组,找到最小的数跟A[0]交换,再从A[1]遍历到A[n],找出最小的数跟A[1]交换,如此反复直到第n-1个数。最后只剩一个数,不用比较了。所以n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。
2.算法分析
时间复杂度:O(N^2)
空间复杂度:O(1)
稳定性:不稳定 (比如 5 8 9 5 2,第一次遍历选择最小的变成, 2 8 9 5 5,第一个5交换到了最后)
3.算法实现:
<span style="white-space:pre"> </span>public static void SelectSort(int[] array){
int tmp = 0;
for(int i =0 ;i < array.length - 1; i++){
int min_index = i;
for(int j =i+1 ; j < array.length ;j++){
if(array[j] < array[min_index]) min_index = j;
}
if (i != min_index){
tmp = array[i] ;
array[i] = array[min_index];
array[min_index] = tmp;
}
}
}
4.算法优化:
该选择排序在一次遍历中只确定最小值或最大值的下标进行交换排序,可以采用以空间换取时间的方法(冒泡排序的改进算法二),在一次遍历中同时记录最小值和最大值所对应的下标,同时进行交换,即一次确定两个元素的位置。这样,时间将会缩短将近一半。
public static void Select2Sort(int[] array){
int tmp = 0;
for(int i =0 ;i < array.length - i; i++){
int min_index = i ,max_index = i;
//确定该趟排序中最大值和最小值的下标
for(int j =i+1 ; j < array.length -i ;j++){
if(array[j] < array[min_index]) min_index = j;
if(array[j] > array[max_index]) max_index = j;
}
//若下标不为i, 进行交换
if (i != min_index){
tmp = array[i] ;
array[i] = array[min_index];
array[min_index] = tmp;
}
//同上
if (i != max_index){
tmp = array[array.length - i - 1] ;
array[array.length - i - 1] = array[max_index];
array[max_index] = tmp;
}
}
}