概念
每一趟在最后的n-i+1(i=1,2,...,n-1)中取最小的记录作为有序表的第i个记录
动态效果:
优点:算法简单,容易实现
缺点:每次只能确定一个元素
Java实现:
package com.liuhao.sort;
import java.util.Arrays;
//定义一个数据包装类
class DataWrap implements Comparable<DataWrap>{
int data;
String flag;
public DataWrap(int data, String flag) {
this.data = data;
this.flag = flag;
}
public String toString(){
return data + flag;
}
@Override
public int compareTo(DataWrap dw) {
return this.data > dw.data ?
1 : (this.data == dw.data ? 0 : -1);
}
}
public class SelectSort {
public static void selectSort(DataWrap[] data){
System.out.println("开始排序");
int arrayLength = data.length;
//依次进行n-1次比较,第i趟比较将第i大的值选出放在i位置上
for(int i=0; i<arrayLength-1; i++){
for(int j=i+1; j<arrayLength; j++){
//i上的数据>j上的数据
if(data[i].compareTo(data[j]) > 0){
DataWrap tmp = data[i];
data[i] = data[j];
data[j] = tmp;
}
}
System.out.println("第" + (i+1) + "趟排序后:" + Arrays.toString(data));
}
}
public static void main(String[] args) {
DataWrap[] data = {
new DataWrap(21, "")
,new DataWrap(30, "")
,new DataWrap(49, "")
,new DataWrap(30, "*")
,new DataWrap(16, "")
,new DataWrap(9, "")
};
System.out.println("排序之前:" + Arrays.toString(data));
selectSort(data);
System.out.println("排序之后:" + Arrays.toString(data));
}
}
运行上面的程序,可以看出下图的排序效果:
直接选择排序每趟只需选出最小的数据,并将其放在本趟首位即可,可以发现,其实每趟只需进行一次交换即可。而上述算法在每趟的比较中,进行了不止一次的交换。
改进算法:
//依次进行n-1次比较,第i趟比较将第i大的值选出放在i位置上
for(int i=0; i<arrayLength-1; i++){
//minIndex用于保留本趟中最小值的索引
int minIndex = i;
for(int j=i+1; j<arrayLength; j++){
//i上的数据>j上的数据
if(data[minIndex].compareTo(data[j]) > 0){
minIndex = j;
}
}
if(minIndex != i){
DataWrap tmp = data[i];
data[i] = data[minIndex];
data[minIndex] = tmp;
}
System.out.println("第" + (i+1) + "趟排序后:" + Arrays.toString(data));
}
每趟比较的目的是找出本趟中最小数据的索引(minIndex)。
算法分析
对于直接选择排序,数据交换的次数最多要n-1次,但比较的次数较多,时间复杂度为O(n2),空间复杂度仅为O(1)。
从上面两个data为30的DataWrap的排序结果来看,直接选择排序是不稳定的。
您的关注是我坚持写作的动力,如果觉得有用,欢迎关注我的微信,海量学习资源免费送!