最简单但是最没用的排序算法,也有优化空间
算法思路:每次遍历找出未排序部分的最小元素,放到前面
时间复杂度:O(n^2)。最好O(n^2),最坏O(n^2)。
空间复杂度:1
稳定性:不稳定
代码实现:
/**
* @ClassName SelectionSort
* @Description 选择排序算法
* @author Yin Guiqing
* @date 2019年3月26日 上午9:43:53
*/
public class SelectionSort {
public static void selectionSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
int minPosition = i; //最小值下标初始设为0
//找出数组中最小值的下标
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minPosition]) {
minPosition = j;
}
}
MyUtils.swap(arr, i, minPosition);
// System.out.println("第" + (i+1) + "趟排序结果:");
// MyUtils.printArr(arr);
}
}
public static void main(String[] args) {
int[] arr = {5, 3, 6, 8, 1, 7, 9, 4, 2};
System.out.println("原数组:");
MyUtils.printArr(arr);
selectionSort(arr);
System.out.println("最终结果:");
MyUtils.printArr(arr);
}
}
时间复杂度分析:
最内层语句共执行了
(n-1) + (n-2) + ... + 2 + 1 = (n^2 - n) / 2,设其他常数时间为t
则时间复杂度为:
O(n) = O( (n^2 - n) / 2 + t )
不考虑常数时间、低次项和系数,最终为O(n^2)
空间复杂度分析
空间复杂度指算法需要用到的额外空间。
选择排序的空间复杂度为O(1)
算法的验证
如何验证算法正确性
产生足够多的随机样本,用确定正确的算法计算样本结果,对比被验证算法的结果
对数器
import java.util.Arrays;
import java.util.Random;
/**
* @ClassName DataChecker
* @Description 对数器,验证排序算法正确性
* @author Yin Guiqing
* @date 2019年3月26日 上午11:14:47
*/
public class DataChecker {
//生成随机数组
public static int[] generateRandomArray() {
Random random = new Random();
int[] arr = new int[10000];
for (int i = 0; i < arr.length; i++) {
arr[i] = random.nextInt(10000);
}
return arr;
}
public static boolean check() {
int[] arr = generateRandomArray();
int[] arr2 = new int[arr.length];
//拷贝数组
System.arraycopy(arr, 0, arr2, 0, arr.length);
Arrays.sort(arr); //用Java的排序算法进行排序
SelectionSort.selectionSort(arr2); //用自己写的选择排序进行排序
boolean same = true;
//逐一比较两个数组排序后的结果
for (int i = 0; i < arr2.length; i++) {
if (arr[i] != arr2[i]) {
same = false;
}
}
return same;
}
public static void main(String[] args) {
System.out.println("Your result is " + check());
}
}
如何写算法程序
1. 由简单到复杂
验证一步走一步
多打印中间结果
2. 先局部后整体
没思路时先细分
3. 先粗糙后精细
变量更名
语句合并
边界处理