zoukankan      html  css  js  c++  java
  • 选择排序算法

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

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

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

        变量更名

        语句合并

        边界处理


    马士兵说

  • 相关阅读:
    Oracle数据库不能使用索引的原因定位
    C语言中的strncmp
    C标准库函数
    C语言字符串函数大全
    Postgres性能检测
    test cert by python
    如何在C语言中巧用正则表达式
    北大软微一年ABCD
    C 语言字符数组的定义与初始化
    25个设计设计灵感的紫色网站案例
  • 原文地址:https://www.cnblogs.com/ME-WE/p/12433584.html
Copyright © 2011-2022 走看看