Selection sort
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
基础版
public class SelectionSort {
public static void main(String[] args) {
int[] arr = {9, 5, 4, 2, 4, 6, 7, 1};
for (int i = 0; i < arr.length-1; i++) {
//找出最小位置
//假定第一个位置为 min position
int minPos = i;
for (int j = i+1; j < arr.length; j++) {
if (arr[j] < arr[minPos]) {
minPos = j;
}
}
System.out.println("minPos:"+ minPos);
//程序执行到此处,说明 minPos 中保存的就是最小位置的下标
//交换
swap(arr, i, minPos);
System.out.println("经过第" + i +"次循环之后:");
print(arr);
System.out.println();
}
System.out.println("最终排序结果(小-->大):");
print(arr);
}
static void print(int[] arr){
//遍历数组元素
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
//交换
static void swap(int[] arr, int i, int j) {
int temp = 0;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
选择排序优化
思路:在每一次循环中,同时找到 最小值和最大值,并确定他们的位置。
/**
* 选择排序改进
* 在每一次循环时,找到最小值和最大值,分别放在数组第一个位置和最后一个位置。
* 循环次数可减少一半
*/
public class SelectionSort {
public static void main(String[] args) {
int[] arr = {9, 5, 4, 2, 4, 6, 7, 1};
for (int i = 0; i < arr.length/2; i++) {
//找出最小位置
//假定第一个位置为 min position
int minPos = i;
int maxPos = i;
// j < arr.length-i
// ”-i“ 防止最大值一直不变
for (int j = i+1; j < arr.length - i; j++) {
if (arr[j] < arr[minPos]) {
minPos = j;
}
if (arr[j] > arr[maxPos]) {
maxPos = j;
}
}
System.out.println("minPos:"+ minPos);
System.out.println("maxPos:"+ maxPos);
//交换
swap(arr, i, minPos);
//因为先确定的是最小值,所以修正 最大值在 i 位置的情况
//比如说 此时交换完之后,数组变为:【1, 5, 4, 2, 4, 6, 7, 9】
//交换之后,maxPos由 0 --> 7 即 maxPos = minPos;
if (maxPos == i) {
maxPos = minPos;
}
swap(arr, arr.length-1-i, maxPos);
System.out.println("经过第" + i +"次循环之后:");
print(arr);
System.out.println();
}
System.out.println("最终排序结果(小-->大):");
print(arr);
}
static void print(int[] arr){
//遍历数组元素
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
static void swap(int[] arr, int i, int j) {
int temp = 0;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
运行结果