• 选择排序算法


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

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

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

        变量更名

        语句合并

        边界处理


    马士兵说

  • 相关阅读:
    Linux 文件系统层次结构 笔记 day 02
    新买服务器 设置ssh秘钥登录
    FastSocket客户端/服务端通讯示例 客户端被动接收
    FastSocket学习笔记~制定自已的传输协议~续~制定基于FastSocket的协议
    Oracle 查看表空间使用率
    Oracle查看用户占用的表空间大小
    failed to flush export bulk [default_local]
    Elasticsearch7.x配置文件
    master not discovered yet, this node has not previously joined a bootstrapped (v7+) cluster
    4.4 rust Smart Pointers Box and Deref 及 空针指
  • 原文地址:https://www.cnblogs.com/ME-WE/p/12433584.html
Copyright © 2020-2023  润新知