zoukankan      html  css  js  c++  java
  • Hark的数据结构与算法练习之希尔排序

    算法说明

    希尔排序是插入排序的优化版。

    插入排序的最坏时间复杂度是O(n2),但如果要排序的数组是一个几乎有序的数列,那么会降低有效的减低时间复杂度。

    希尔排序的目的就是通过一个increment(增量)来对数列分组进行交换排序,最终使数列几乎有序,最后再执行插入排序,统计出结果。

    通过increment=n/2, 也就是如果9个数的话,增量为4,2,1。   如果是20个数的话,增量就是10,5,2,1。  当increment为1时,其实对几乎有序的数列进行插入排序啦啦。

    时间复杂度

    O(n2/3)

    空间复杂度

    O(1)

    代码

    使用的是Java

    /*
     * 希尔排序
     */
    public class ShellSort {
    	public static void main(String[] args) {
    		int[] arrayData = { 5, 9, 6, 7, 4, 1, 2, 3, 8 };
    		ShellSortMethod(arrayData);
    		for (int integer : arrayData) {
    			System.out.print(integer);
    			System.out.print(" ");
    		}
    	}
    
    	public static void ShellSortMethod(int[] arrayData) {
    		int i, j, temp = 0;
    		int increment = arrayData.length;
    		do {
    			increment = increment / 2;  //增量
    			for (i = increment; i < arrayData.length; i++) {
    				if (arrayData[i] > arrayData[i - increment]) {   //判断是否要进行插入排序
    					temp = arrayData[i];  //将要插入的值存放在临时变量中
    					
    					//这里其实做的就是插入排序,将以增量为步长,往后移动。   
    					//temp > arrayData[j] 这个是要注意的,只会移动比要插入的值小的数字
    					for (j = i - increment; j >= 0 && temp > arrayData[j]; j -= increment) {
    						arrayData[j + increment] = arrayData[j];
    					}
    					arrayData[j + increment] = temp;
    				}
    			}
    		} while (increment > 0);
    	}
    }
    

      

     

    结果

    9 8 7 6 5 4 3 2 1 
    
  • 相关阅读:
    王爽《汇编语言》第三版 第一章 基础知识
    JAVA拷贝视频文件无法播放的解决方法
    算法导论 第2章 算法基础
    今天来个爪哇去边框的小代码
    设计模式_Adapt
    qs面试记录
    zl面试记录
    pa_ns2面试记录
    pa_ns1面试总结
    sfjc面试记录
  • 原文地址:https://www.cnblogs.com/hark0623/p/4346146.html
Copyright © 2011-2022 走看看