算法笔记–再回顾选择排序
选择排序很符合人类的直觉,它的核心就是从无序的元素中挑选出有序的元素,可以用一篮子苹果来形象描述这个过程,首先我们从篮子中挑选出最小的一个,然后继续从篮子中挑选出最小一个,这时手中就得到了两个比较小的苹果排序,重复此过程,直至篮子的苹果被挑选完,可见这样的挑选过程本身也是排序过程。

解题:用一个数组来表示元素集合
- 选定第一个元素,与数组其他元素遍历比较,找到最小的一个,然后交换,此时挑选出最小值
- 选定第二个元素,与剩下的数组(篮子中的苹果)元素遍历比较,找到最小的一个,然后交换,此时挑选出次小值
- 重复步骤直至数组完全排序
时间复杂程度:
- O(n^2)
选择排序与冒泡法比较,选择排序明显减少了值的交换次数
案例实践
public class SelectSort {
public static void main(String[] args) {
int[] a = {5,6,1,2,3,4,7,8,9};
sort(a);
// sortOptimize(a);
for (int i = 0; i < a.length; i++) {
System.out.printf("%2d",a[i]);
}
}
private static void sort(int arr[]){
int k = 0;
for (int n = 0; n < arr.length - 1; n++) {
int min = arr[n]; // 先假定第一个数为最小值
int minIndex = n;
for (int j = n + 1; j < arr.length; j++) {
// 挨个与最小值对比,如果小于,则进行交换
if (min > arr[j]) {
// 如果后面的值比当前的 min 小,则重置为这个数
min = arr[j];
minIndex = j;
}
k++;
}
// 第 n 轮结束后,得到了最小值
// 将这个最小值与 arr[n] 交换
arr[minIndex] = arr[n];
arr[n] = min;
// System.out.println("第 " + (n + 1) + " 轮排序后:" + Arrays.toString(arr));
}
System.out.println("选择排序循环的次数: " + k);
}
/**
* 选择排序优化,对于已经排序好的数据可以明显减少循环次数
* @param arr
*/
private static void sortOptimize(int arr[]){
int k = 0;
boolean change = false;
for (int n = 0; n < arr.length - 1; n++) {
int min = arr[n]; // 先假定第一个数为最小值
int minIndex = n;
change = true;
for (int j = n + 1; j < arr.length; j++) {
// 挨个与最小值对比,如果小于,则进行交换
if (min > arr[j]) {
// 如果后面的值比当前的 min 小,则重置为这个数
min = arr[j];
minIndex = j;
}
//判断接下的元素是否都是有序的
if(j < arr.length -1 && arr[j] > arr[j+1]){
change = false;
}
k++;
}
// 第 n 轮结束后,得到了最小值
// 将这个最小值与 arr[n] 交换
arr[minIndex] = arr[n];
arr[n] = min;
// System.out.println("第 " + (n + 1) + " 轮排序后:" + Arrays.toString(arr));
if (change){
break;
}
}
System.out.println("选择排序循环的次数: " + k);
}
}
本文再次探讨选择排序算法,通过挑选最小元素并交换的方式实现排序。算法时间复杂度为O(n^2),相较于冒泡排序,选择排序能减少不必要的值交换。通过案例实践,加深对该算法的理解。
1010

被折叠的 条评论
为什么被折叠?



