希尔排序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();
	}
}

  

  

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。