定义
它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
步骤
- 假设我们拿到的起始位置的数值是最小的
- 拿起始位置的值与后面所有数值进行比较
- 选择数值比较小的数值的角标与临时变量里存放的角标进行交换
- 确定第一个有序值
//i:要排第几个
//j:用来进行比较
//temp:临时变量用来存放最小值
//arr[]:定义一个带比较的数组
public class XuanZeSort {
//选择排序
public static void xuanZeSort(int[] arr){
//可以写成i < arr.length-1
//如果代派数组是5个数,前四个都有序后第5个没有必要再进行一次比较
for(int i = 0; i < arr.length-1; i++){
int temp=arr[i];
//将下标为0的数与下标为1的数进行比较
//也就是i与j进行比较
for(int j = i+1; j< arr.length; j++){
//如果临时变量存放角标为i的值比arr[j]大
//将临时变量的值与角标为j的值进行交换
if(arr[j] < temp){
temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
//PrintArray.printArray(arr);
}
PrintArray.printArray(arr);
}
}
- 这样排序没做一次比较就会进行一次数组下角标的交换比较浪费空间,时间复杂度和空间复杂度都比较大
优化
public class SelectionSort {
public static void selectionSort(int[] a) {
int n = a.length;
for (int i = 0; i < n; i++) {
//定义一个变量来存放数组下角标
int k = i;
// 找出最小值的小标
for (int j = i + 1; j < n; j++) {
if (a[j] < a[k]) {
//确定下角标为k的值最小
k = j;
}
}
// 将最小值与我们假定的其实位置数值进行交换
if (k > i) {
int tmp = a[i];
a[i] = a[k];
a[k] = tmp;
}
}
}
- 我们只需要将所有的数值比较完最后进行一次交换就可以
- 节省了时间和空间
小结
先缕清思路,然后写出伪代码,最后根据自己的伪代码与可运行的代码进行比较,循序渐进,提升对算法的理解