源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

浅析java 希尔排序(Shell)算法

  • 时间:2020-07-05 11:12 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:浅析java 希尔排序(Shell)算法
先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<;…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。 该方法实质上是一种分组插入方法。 原理图: [img]http://img.1sucai.cn/uploads/article/2018010710/20180107100159_0_21198.png[/img] 源代码
[u]复制代码[/u] 代码如下:
package com.zc.manythread; /**  *  * @author 偶my耶  *  */ public class ShellSort {     public static int count = 0;     public static void shellSort(int[] data) {         // 计算出最大的h值         int h = 1;         while (h <= data.length / 3) {             h = h * 3 + 1;         }         while (h > 0) {             for (int i = h; i < data.length; i += h) {                 if (data[i] < data[i - h]) {                     int tmp = data[i];                     int j = i - h;                     while (j >= 0 && data[j] > tmp) {                         data[j + h] = data[j];                         j -= h;                     }                     data[j + h] = tmp;                     print(data);                 }             }             // 计算出下一个h值             h = (h - 1) / 3;         }     }     public static void print(int[] data) {         for (int i = 0; i < data.length; i++) {             System.out.print(data[i] + "t");         }         System.out.println();     }     public static void main(String[] args) {         int[] data = new int[] { 4, 3, 6, 2, 1, 9, 5, 8, 7 };         print(data);         shellSort(data);         print(data);     } }
运行结果: [img]http://img.1sucai.cn/uploads/article/2018010710/20180107100100_1_63934.png[/img] Shell排序是不稳定的,它的空间开销也是O(1),时间开销估计在O(N3/2)~O(N7/6)之间
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部