基础算法系列(十六)排序算法之希尔排序

来源:互联网 发布:java junit单元测试 编辑:程序博客网 时间:2024/06/05 18:08

 基本思想:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。

希尔排序过程图解:

数组:45,20,80,40,26,58,66,70

d=5时   分组为:45,58

               20,66

        80,70

排完后为: 45,20,70,40,26,58,66,80

d=3时 分组为:45,40,66

       20,26,80

       70,58

         40,66

         26,80

排完后为:40,20,58,45,26,70,66,80

d=1时 分组为:40,20,58,45,26,70,66,80

排序后直接得到结果:

20 26 40 45 58 66 70 80
<span style="font-size:14px;">/** * 希尔排序升序 *  */public static int sort_xier_asc(int[] array) {int count = 0;if (array.length < 2)return count;if (array.length == 2) {if (array[0] < array[1])return count;else {count++;int temp = array[1];array[1] = array[0];array[0] = temp;return count;}}int shell = array.length / 2;if (shell % 2 == 0)shell++;for (int d = shell; d > 0; d -= 2)for (int i = 0; i < array.length - d; i++) {for (int j = i; j < array.length; j = j + d)for (int k = j; k > 0; k = k - d) {if (k < d)break;if (array[k] < array[k - d]) {count++;int tmp;tmp = array[k];array[k] = array[k - d];array[k - d] = tmp;}}}return count;}</span>

/** * 希尔排序降序 *  */public static int sort_xier_dasc(int[] array) {int count = 0;if (array.length < 2)return count;if (array.length == 2) {if (array[0] > array[1])return count;else {count++;int temp = array[1];array[1] = array[0];array[0] = temp;return count;}}int shell = array.length / 2;if (shell % 2 == 0)shell++;for (int d = shell; d > 0; d -= 2)for (int i = 0; i < array.length - d; i++) {for (int j = i; j < array.length; j = j + d)for (int k = j; k > 0; k = k - d) {if (k < d)break;if (array[k] > array[k - d]) {count++;int tmp;tmp = array[k];array[k] = array[k - d];array[k - d] = tmp;}}}return count;}



0 0
原创粉丝点击