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完成 快速排序好几分钟还没完成(没耐心等了)
相关文章推荐
- 希尔(shell)排序原理分析及Java实现
- 希尔(Shell)排序 Java实现
- Shell(希尔)排序(java实现)
- 排序算法复习(Java实现): 插入,冒泡,选择,Shell,快速排序
- 排序算法复习(Java实现):插入,冒泡,选择,Shell,快速排序, 归并排序,堆排序,桶式排序,基数排序
- Java实现数组排序总结篇(冒泡,选择,插入,希尔)
- shell脚本实现希尔(shell)排序
- 排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序
- 必须知道的八大种排序算法【java实现】(二) 选择排序,插入排序,希尔算法【详解】
- Java实现的排序算法及比较 [冒泡,选择,插入,归并,希尔,快排]
- UVa Problem 10152 ShellSort (龟壳排序)java实现
- 排序(4)---------希尔(shell)排序(C语言实现)
- 排序(4)---------希尔(shell)排序(C语言实现)
- 选择,插入,希尔,快速,堆,归并排序六种排序方式的Java 实现和性能对比(付代码)
- java实现直接出入、希尔、直接选择、快速排序
- 必须知道的八大种排序算法【java实现】(二) 选择排序,插入排序,希尔算法【详解】
- Java 详解希尔(Shell)排序
- 排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序
- 排序算法复习(Java实现)(二): 插入,冒泡,选择,Shell,快速排序
- 排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序