• 希尔排序java


    希尔排序简述  

    希尔排序是基于插入排序的以下两点性质而提出改进方法的:
    1. 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。(希尔排序先将部分数据进行排序,相当于已经部分排好序)
    2. 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。(希尔排序先将间隔大的数据进行大的移位,后期的移位距离相对要小很多)

    分析:

      先去一个小于n的整数的H作为第一个增量,把文件的全部记录分组。即将所有距离为H的倍数的记录放在同一个族中,先在各组内进行直接插入排序;然后去第二个增量重复上述的分组和排序,直至所取的增量为1。

      例子:对7、10、1、9、2、5、8、6、4、3数组进行一增量为4的希尔排序过程,数组可以看成是由4个字数组组成(0、4、8)(1、5、9)(2、6)(3、7)。

     

     后面如果取增量为1的话,就是对整个数组进行插入排序。

      希尔排序的优点就是减少了插入排序的数据的大量复制和移动,同时也是效率得到了很大的提高。

    实现代码:

    希尔排序类:

    package com.dxx.order;
    
    import java.util.ArrayList;
    
    public class ShellSort {
    private int arrs[];
    //设置增量数组,公式为h=3*h+1,eg:1、4、13、40....找到接近数组长度但是小于它的增量为止
    private ArrayList<Integer> rises = new ArrayList<Integer>();
    
    	public ShellSort(int[] arrs) {
    		super();
    		this.arrs = arrs;
    	}
    	
    	//定义增量数组
    	public void setRises(){
    		int len = arrs.length;
    		int h = 1;
    		int count=0;
    		while(true){
    			if(h>=len){
    				break;
    			}
    			rises.add(h);
    			h = 2*h + 1;
    		}
    	}
    	
    	public void sortArrs(){
    		int h,temp,len = rises.size();
    		//根据增量依次进行排序
    		for(int i=0; i<len;i++){
    			h = rises.get(len-1-i);
    			//对增量为h的数组进行排序arrs[h]
    			for(int k=h;k<arrs.length;k++){
    				//以冒泡排序的方式对一个增量为h的数组进行排序
    				if(arrs[k]<arrs[k-h]){
    					temp = arrs[k];
    					while(k>=h && temp<arrs[k-h]){
    						arrs[k] = arrs[k-h];
    						k-=h;
    					}
    					arrs[k] = temp;
    					k+=h;
    				}
    			}
    			
    		}
    	}
    	
    	public void sortArrs2(){
    		int group, i, j, temp;
    		int len = arrs.length;
            for (group = len / 2; group > 0; group /= 2)
            {
                for (i = group; i < len; i++)
                {
                    for (j = i - group; j >= 0; j -= group)
                    {
                        if (arrs[j] > arrs[j + group])
                        {
                            temp = arrs[j];
                            arrs[j] = arrs[j + group];
                            arrs[j + group] = temp;
                        }
                    }
                }
            }
    	}
    	
    	public void printArrs(){
    		for(int i :arrs){
    			System.out.print(i + "   ");
    		}
    		System.out.println();
    	}
    }
    

    主程序类:

    package com.dxx.order;
    
    public class MainTest {
    
    	public static void main(String[] args) {
    		int arrs[] = {14,3,2,5,12,8,6,7,10,11,1,9,13};
    		ShellSort shellSort = new ShellSort(arrs);
    		shellSort.printArrs();
    		shellSort.setRises();
    		shellSort.sortArrs();
    		shellSort.printArrs();
    	}
    }
    

      

      

  • 相关阅读:
    POJ 3695 Rectangles
    POJ 2002 Squares
    linux 查看磁盘空间大小
    keymaster 快捷键管理器
    Pxloader
    as3数据类型检查写法(is/as/typeof/in/instanceof)用法介绍
    javascript的dom选择器
    javascript音频管理方案:SoundManager2
    Morris.js – 画折线图、面积图和环状图的统计图表库
    jsuri 让你方便的处理url
  • 原文地址:https://www.cnblogs.com/dxx-blogs/p/4466243.html
Copyright © 2020-2023  润新知