希尔排序java
希尔排序简述
-
插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。(希尔排序先将部分数据进行排序,相当于已经部分排好序)
-
但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。(希尔排序先将间隔大的数据进行大的移位,后期的移位距离相对要小很多)
分析:
先去一个小于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(); } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。