SHELL排序
来源:互联网 发布:数据恢复中心 赵力 编辑:程序博客网 时间:2024/05/16 15:58
SELL排序,对于这个排序来说其实也不难,如果掌握了之前的直接插入排序之后,再来看shell排序会很简单,思想都是一样,都是采用插入的手法,只是效率和移动元素的数量不同而已,整体思想是这样的,我们先回顾一下直接插入排序,直接插入排序是认为左边的序列是有序的,然后通过遍历前面的序列找到插入数的位置然后将后面的数据单元向后移动,最后进行插入。
SHELL在此基础上又进行了排序,它加大了排序中元素的间隔,使数据进行大幅度的移动,从而减少了移动的数据元素,先来看一组数据
22,8,4,56,2,6,7
2,8,4,56,22,6,7
2,8,4,56,22,6,7
2,6,4,56,22,8,7
大概的一个流程就是这样,从上面数据可知道,间隔为4,然后不断的减少间隔直到间隔小于1之后结束。这样就减少了数据元素的大量移动搬家。
这个算法是由Knuth提出的,间隔数通过一下序列产生
h = 3*h+1
同时在还需要反向计算该值,
h = (h-1)/3
代码如下:
package com.demo;import java.util.ArrayList;import java.util.List;import java.util.Random;/** * Created by wk on 2014/6/30. */public class ShellSort { //SHELL排序 public static void main(String args[]) { int[] older_arr = getArray(10); System.out.println("未排序:"); display(older_arr); int[] new_arr = ShellSort(older_arr); System.out.println("排序后:"); display(new_arr); } static int[] ShellSort(int sorts[]) { int length = sorts.length; int h = 1; //获取增量最大子序列 while (h<=length/3) { h = h*3+1; } while (h>0) { for (int i = h; i < length; i++) { int tmp = sorts[i]; if (tmp<sorts[i-h]) { int j = i-h; for (; j>=0&&tmp<sorts[j] ; j-=h) { sorts[j+h] = sorts[j]; } sorts[j+h] = tmp; } } h = (h-1)/3; } return sorts; } public static void display(int[] arrays) { for (Integer i : arrays) System.out.print(i + ","); } //获取不重复随机数 public static int[] getArray(int n) { List<Integer> list = new ArrayList<Integer>(); int[] ins = new int[n]; for (int i = 0; i < n; i++) { int number = new Random().nextInt(1000); if (!list.contains(number)) { list.add(number); ins[i] = number; } } return ins; }}
0 0
- shell排序
- shell排序
- SHELL排序
- Shell排序
- shell排序
- shell排序
- Shell 排序
- Shell排序
- Shell排序
- Shell排序
- shell 排序
- shell排序
- shell排序
- Shell排序
- Shell排序
- Shell排序
- Shell排序
- shell排序
- 后方可恢复卡手放开手放开速度和福克斯都很疯狂的划分地块
- mysql创建触发器
- google code jam 2014 RC_C
- 什么是用户故事
- 2013-06-30-VPN内网对接
- SHELL排序
- 多媒体之mp3
- 创建定性用户画像
- 题目1522:包含min函数的栈
- MRVC数据可视化应用、交互平台
- obj-c编程08:分类和协议
- 编程技术是写出来的
- 弱校ACM奋斗史
- IPtables中SNAT、DNAT和MASQUERADE的含义