[排序]直接插入排序、希尔排序

直接插入排序

适合原本基本有序的序列。
时间复杂度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

原文地址:https://www.cnblogs.com/coding-gaga/p/11055949.html