最简单但是最没用的排序算法,也有优化空间

算法思路:每次遍历找出未排序部分的最小元素,放到前面

时间复杂度: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. 先粗糙后精细

    变量更名

    语句合并

    边界处理

 


马士兵说