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

    1.直接插入排序

      时间复杂度O(n2)

      工作原理:

      通过构建有序序列,对于未排序数据,在已排序的序列中,从后向前扫描,找到相应的位置并插入。

      插入排序在实现上,在从后向前扫描的过程中,需要反复把已排序元素逐步向后移动为最新元素提供插入空间

      

    //直接插入排序
    public static void InsertSort(int[] a,int n){
    	int i,j,t;
    	for(i=1;i<n;i++){
    		t=a[i];//取出一个未排序的数据
    		for(j=i-1;j>=0&&t<a[j];--j){//在已排序的序列这查找位置,t<a[j],说明要把t插入到前面去
    			a[j+1]=a[j];//向后移动数据
    		}
    			a[j+1]=t;//将临时元素插入到腾出的位置中
    	}
    }
    

    2.希尔排序

       希尔排序是插入排序的一种高效率的实现,也叫缩小增量排序。简单的插入排序中,如果待排序列是正序时,时间复杂度是O(n),如果序列是基本有序的,使用直接插入排序效率就非常高。希尔排序就利用了这个特点。

      基本思想是:先将整个待排记录序列分割成为若干子序列分别进行直接插入排序待整个序列中的记录基本有序时再对全体记录进行一次直接插入排序

      (1)间隔的计算:

         间隔h的初始值为1,通过h=3*h+1来循环计算,直到该间隔大于数组的大小时体质。最大间隔不大于数组大小的最大值,如:数组长度为10,最大间隔可以为4

      (2)间隔的减少:

           可以通过h=(h-1)/3来计算

        

    package com.sort;
    
    /*希尔排序*/
    public class ShellSort {
    
        public static void shellSort(int[] arr){
            //初始化一个间隔
            int h=0;
            //计算最大间隔
            while (h<arr.length/3+1) {//当arr.length=10时,发现h=4时合适
                h=h * 3+1;
    
            }
            while (h>0) {
                //进行插入排序
                int target=0;
                for (int i = h; i < arr.length; i++) {//i=1是第二个数,假设第一个数的位置是正确的;要往后移,必须要假设第一个
                    target=arr[i];//待插入的
                    int j=i;
                    //后移
                    while (j>h-1 && target<=arr[j-h]) {
                        arr[j]=arr[j-h];//按间隔的距离得到要交换的两个数
                        j-=h;
                    }
    
                    arr[j]=target;
                }
                //减小间隔
                h=(h-1)/3;
            }
        }
    }
    TestShellSort
    package com.sort;
    
    public class TestShellSort {
    
        public static void main(String[] args) {
            int[] arr=new int[9];
            arr[0]=9;
            arr[1]=1;
            arr[2]=5;
            arr[3]=8;
            arr[4]=3;
            arr[5]=7;
            arr[6]=4;
            arr[7]=6;
            arr[8]=2;
    
            System.out.print("[");
            for (int num : arr) {
                System.out.print(num+" ");
            }
            System.out.print("]");
            System.out.println();
    
            ShellSort.shellSort(arr);
            System.out.print("[");
            for (int num : arr) {
                System.out.print(num+" ");
            }
            System.out.print("]");
            System.out.println();
    
        }
    
    }
    

      栗子:

      有些排序算法在每趟排序过程中,都会有一个元素被放置在其最终的位置上,下列算法不会出现此情况的是()

      正确答案: A   你的答案: D (错误)

        A.希尔排序

        B.堆排序

        C.起泡排序

        D.快速排序

  • 相关阅读:
    CPP--关于long的争议和思考
    CPP--借助神器VS理解内存存储(含大小端对齐)
    1.QT开发第一个程序
    POJ-1456 Supermarket 贪心问题 有时间限制的最小化惩罚问题
    HDU-4310 Hero 贪心问题
    HDU-1789 Doing Homework again 贪心问题 有时间限制的最小化惩罚问题
    HDU-2303 The Embarrassed Cryptographer 高精度算法(大数取模)
    【错题本】刷算法题中出现的一些错误和小技巧
    HDU-2050 折线分割平面 找规律&递推
    记intel杯比赛中各种bug与debug【其五】:朴素贝叶斯分类器的实现和针对性的优化
  • 原文地址:https://www.cnblogs.com/GumpYan/p/5762319.html
Copyright © 2011-2022 走看看