选择排序(SelectionSort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。它是不稳定的排序方法(比如序列[8,8, 2]第一次就将第一个[8]与[2]交换,导致第一个8挪动到第二个8后面)。
这只是一个toy program,用来说明选择排序优化过程。
eg:输入一组数据,按照从小到大进行排序。
//选择排序
public class TestNumSort{
public static void main(String [] args){
int[] a =new int[args.length]; //定义一个数组,输入多少数组就是多大
for(int i=0;i<args.length;i++){
a[i] = Integer.parseInt(args[i]); //转换成int类型放到数组
}
print(a); //调用print方法,把输入的数字输出
selectSort(a); //调用选择排序方法
print(a);
}
//选择排序,未优化(如果是不规则的数比较多,每次遍历可能会进行多次交换)
private static void selectSort(int[] a){
for (int i=0;i<a.length;i++){ //数组里的数
for (int j=i+1;j<a.length;j++){ //把拿到的数a[i]和下一个数a[j]进行比较
if(a[j] < a[i]){ //如果后面的数a[j]小于拿到的数a[i],则把后面的数调到前面,即交换位置
int temp = a[i]; //临时变量,先把拿到的数a[i]放到temp中
a[i] = a[j]; //再把后面的数a[j]放到a[i]中
a[j] = temp; //最后把temp的值赋给a[j]
}
}
}
}
/* //优化选择排序(每次遍历只会出现一次交换,性能更好)当找到拿到的数与下一个数小的时候,再
把下一个数直接和后面的数进行比较,如果有更小的,则交换位置
private static void selectSort(int[] a){
int k,temp; //在循环之前定义,不用每次循环的时候都要分配栈空间
for (int i=0; i<a.length; i++){
k = i; //假设找到当前最小的数,位置为i
for(int j=k+1; k<a.length; j++){ //j往后找比i更小的数
if(a[j] < a[k]){ //如有后面的数有比拿到的数还要小的数
k = j; //则交换位置
}
}
//如果从后面找到的数与当前最小的数不相等,则交换位置
if(k != i){
temp = a[i];
a[i] = a[k];
a[k] = temp;
}
}
} */
//打印数组
private static void print(int[] a){
for(int i=0;i<a.length;i++){
System.out.print(a[i] + " "); //把输入的数字依次输出
}
System.out.println();
}
}
运行结果:
优化原理:
1.减少位置交换次数,未优化之前是每遍历一次就要交换一次位置,这是不必要的
2.减少栈的使用次数。不用每次循环的时候都要创建一个变量。