java-------希尔排序

来源:互联网 发布:数据挖掘原理 张银奎 编辑:程序博客网 时间:2024/05/17 08:32

1.希尔排序基本思想:

  先取一个小于n的整数span[1]作为第一个增量,把文件的全部记录分成span[1]个组。所有距离为span[1]的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量span[2]<span[1]重复上述的分组和排序,直至所取的增量span[n]=1(spans[]中的元素依次减小,最后一个元素为一),即所有记录放在同一组中进行直接插入排序为止。
  该方法实质上是一种分组插入方法。
  给定实例的shell排序的排序过程
  假设待排序文件有10个记录,其关键字分别是:
     6, 5, 8, 9, 7, 122, 56, 8, 956, 63, 56, 45, 899, 55 
  增量序列的取值依次为:

  5,3,1

2.主程序

package advanced_sort;public class Shell_Sort {protected int size;// 待排序的数组元素个数/*---跨度函数spans的最后一个值为1,此时进行进行一次插入排序, *   但因为此时数据已经基本有序,因此元素间的复制次数较小 */public Shell_Sort(int size) {this.size = size;}public void shellSort(int[] Darry, int[] spans) {int L = spans.length;// 跨度函数大小,决定外围循环次数int span;// 每次排序的跨度大小for (int i = 0; i < L; i++) {// 外围循环次数span = spans[i];// span本次所用的跨度for (int j = 0; j < span; j++) {// span决定每次循环分的组数,对每个小组进行插入排序int temp;// 用于当前元素存储,因为前面较大的元素可能覆盖当前元素int pre;// 用于指示与当前元素比较的元素/*---运用插入排序对每组数据进行排序,元素之间的间隔为span * ---k的初始值为每个小组的第二个元素,把第一个元素当成是有序的,简单插入排序的思想。 * */for (int k = j + span; k < size; k = k + span) {temp = Darry[k];pre = k - span;while (pre >= 0 && Darry[pre] > temp) {Darry[pre + span] = Darry[pre];pre = pre - span;}// end whileDarry[pre + span] = temp;}// end for}}// end for}// end shellSortpublic void display(int[] array) {for (int i = 0; i < array.length; i++) {System.err.print(array[i] + "  ");}}}// end class

3.测试程序

package advanced_sort;public class App {static int[] array = { 6, 5, 8, 9, 7, 122, 56, 8, 956, 63, 56, 45, 899, 55 };static int[] spans = { 5 ,3,1};/** * @param args */public static void main(String[] args) {Shell_Sort shell = new Shell_Sort(array.length);shell.display(array);System.err.println();shell.shellSort(array, spans);shell.display(array);}}

4.测试结果

6  5  8  9  7  122  56  8  956  63  56  45  899  55  5  6  7  8  8  9  45  55  56  56  63  122  899  956  



	
				
		
原创粉丝点击