zoukankan      html  css  js  c++  java
  • [排序]直接插入排序、希尔排序

    直接插入排序

    适合原本基本有序的序列。
    时间复杂度O(n^2)。

    插入排序详细步骤

    代码

    public class Main {
    	public static void main(String args[]) {
    		int[] arr= {3,5,1};
    		insertSort(arr);
    		for(int num:arr) {
    			System.out.print(num);
    		}
    	}
    	
    	public static void insertSort(int[] arr) {
    		for(int i=1;i<arr.length;++i) {
    			for(int j=i-1;j>=0&&arr[j]>arr[j+1];--j) {
    				swap(arr,j,j+1);
    			}
    		}
    	}
    
    	private static void swap(int[] arr, int i, int j) {//
    		int temp=arr[i];
    		arr[i]=arr[j];
    		arr[j]=temp;
    	}
    }
    

    希尔排序

    • 设置初始增量,增量慢慢变为原来的1/2,保证增量条约对应的一组组数内部有序,采用直接插入排序。
    • 是改进的插入排序,就是为了使数组基本有序:指小的基本在前面,中的基本在中间,大的基本在后面。(区分于局部有序)。这样可以大大减少交换次数。
    • 时间复杂度与增量的选取有关,平均O(nlogn)。

    希尔排序详细步骤

    • 也称为缩小增量排序。是直接插入排序的改进版本。希尔排序是非稳定排序算法。
    • 基本思想:将待排序列按增量划分为若干组,在每一组内进行插入排序。不断减小增量,并在组内插入排序,直至增量减小为1。
    • 优劣:
      1. 不需要大量的辅助空间,和归并排序一样容易实现。
      2. 希尔排序的时间复杂度与增量序列的选取有关,例如希尔增量时间复杂度为O(n²),而Hibbard增量的希尔排序的时间复杂度为O(),希尔排序时间复杂度的下界是n*log2n。
         3. 希尔排序没有快速排序算法快 O(n(logn)),因此中等大小规模表现良好,对规模非常大的数据排序不是最优选择。
         4. 希尔算法在最坏的情况下和平均情况下执行效率相差不是很多,而快速排序在最坏的情况下执行的效率会非常差。

    代码

    public class Main {
    	public static void main(String args[]) {
    		int[] arr= {3,5,1};
    		shellSort(arr);
    		for(int num:arr) {
    			System.out.print(num);
    		}
    	}
    	
    	public static void shellSort(int arr[]) {
    		int len = arr.length;
            for(int gap=len/2; gap>=1; gap=gap/2){                  
                for(int i=gap+1; i<len; i++){
                    for(int j=i-gap; j>=0&&arr[j]>arr[j+gap]; j=j-gap){        
                        swap(arr,j,j+gap);
                    }
                }
            }
    	}
    	
    	private static void swap(int[] arr, int i, int j) {
    		int temp=arr[i];
    		arr[i]=arr[j];
    		arr[j]=temp;
    	}
    }
    

    参考链接

    https://www.cnblogs.com/ronnydm/p/5905715.html

  • 相关阅读:
    Kubernetes Jenkins动态创建Slave
    运维故障汇总
    Spinnaker调用Jenkins API 返回403错误
    linux删除文件空间不释放问题解决
    华为 路由交换之DHCP
    华为 路由交换之PPPoE
    关于==和equals的探索
    springboot&mybatis 增删改查系列(二)
    springboot&mybatis 增删改查系列(一)
    nginx简单使用(windows)
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/11055949.html
Copyright © 2011-2022 走看看