您的位置:首页 > 运维架构 > Shell

Java实现希尔(Shell)排序

2014-01-26 15:49 211 查看
import java.text.SimpleDateFormat;
import java.util.Date;

public class ShellSort
{
private long[] arr;	//要排序的数组
private int size;	//初始化数组大小
private int length;	//数组实际大小(即有多少个值)

public ShellSort(int size){
this.arr=new long[size];
this.size = size;
length = 0;
}
//往数组添加值
public void add(long value){
if(length < size)
arr[length++] = value;
}
//打印
public void display(){
for(int i=0; i<length; i++){
System.out.print(arr[i]+" ");
}
System.out.println(" ");
}
//交换数组两个位置的数据
public void swap(int left, int right){
long tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
}

/**
* 取数组最后一个数作为"中间值",将数组分成比"中间值"小和比"中间值"大的两部分
* 将"中间值"交换到两部分数据的中间位置
* 然后对"中间值"两边的数组,递归的执行该操作...
* @param left
* @param right
*/
public void sort(){
int count = 0;
while(count<length){
count = count*3+1;
}
int interval = (count-1)/3;
//逐渐减小增量,直到最后=1
while(interval>=1){
//从0开始以interval为增量的等差数列,进行插入排序
//从1开始以interval为增量的等差数列,进行插入排序
//...
//从interval-1开始以interval为增量的等差数列,进行插入排序
//确保所有数据都进行了排序
for(int i=0; i<interval; i++){
int j=1;
//依次将数据一个个插入前面已排序的序列中;相对于第二个数来说,第一个数就是已排序好的序列
while((i+j*interval)<length){
int tmpj = j;
long tmp = arr[i+j*interval];
while(--tmpj>=0 && arr[i+tmpj*interval]>tmp){
arr[i+tmpj*interval+interval]=arr[i+tmpj*interval];
}
arr[i+tmpj*interval+interval]=tmp;
j++;
}
}

interval = (interval-1)/3;
}
}

public static void main(String[] args){
ShellSort sort = new ShellSort(1000000);
for(int i=0; i<1000000; i++){
sort.add((long)(Math.random()*100));
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ms");
System.out.println(sdf.format(new Date()));
//sort.display();
sort.sort();
//sort.display();
System.out.println(sdf.format(new Date()));
}
}


--------------------------------------------------------------------------------

希尔排序和快速排序的效率比较:对于无序数组,【希尔排序】完胜【快速排序】(当然也可能本人算法实现的不好)

用本人写的代码进行测试------------

100w随即无序数组 希尔排序:1ms完成 快速排序6s完成

1000w随即无序数组 希尔排序:5s完成 快速排序好几分钟还没完成(没耐心等了)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐