锁定老帖子 主题:希尔排序和插入排序,哪个更快些
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-05-21
zzy198772 写道 /**
*插入排序 **/ package com.util; public class InsertSort { public static void main(String[] args) { int[] data = new int[100000]; for (int i = 0; i < 100000; i++) { int temp = (int) (Math.random() * 100000); System.out.println("temp==" + temp); data[i] = temp; } InsertSort insertSort = new InsertSort(); long begin = System.currentTimeMillis(); insertSort.sort(data); long end = System.currentTimeMillis(); System.out.println("插入排序所用时间:" + (end - begin) / 1000); } public void sort(int[] data) { for (int i = 1; i < data.length; i++) { for (int j = i; (j > 0) && (data[j] < data[j - 1]); j--) { swap(data, j, j - 1); } } } public void swap(int[] data, int i, int j) { int temp = data[i]; data[i] = data[j]; data[j] = temp; } } /** *希尔排序 **/ package com.util; public class ShellSort { public static void main(String[] args) { int[] data = new int[100000]; for (int i = 0; i < 100000; i++) { int temp = (int) (Math.random() * 100000); //System.out.println("temp==" + temp); data[i] = temp; } ShellSort shellSort = new ShellSort(); long begin = System.currentTimeMillis(); shellSort.sort(data); long end = System.currentTimeMillis(); System.out.println("希尔排序所用时间:" + (end - begin) / 1000); for(int i=0;i<data.length;i++){ System.out.println(data[i]); } } public void sort(int[] data) { for (int i = data.length / 2; i > 0; i /= 2) { for (int j = 0; j < i; j++) { insertSort(data, j, i); } } } public void insertSort(int[] data, int start, int inc) { for (int i = start + inc; i < data.length; i += inc) { for (int j = i; (j >= inc) && (data[j] < data[j - inc]); j -= inc) { swap(data, j, j - inc); } } } public void swap(int[] data, int i, int j) { int temp = data[i]; data[i] = data[j]; data[j] = temp; } } 谢谢,的确要考虑数字的随机性 |
|
返回顶楼 | |
发表时间:2011-05-21
ujnlu 写道 其实希尔就是改进的插入排序。
速度根据数据初始的结构来的 还有距离因素,如果两个数据之间相差不大 希尔比插入好不了哪里去 对于数据量非常大的时候,希尔排序是要比插入排序高效。不过对于数据量很大的时候,一般都用快排了。 |
|
返回顶楼 | |
发表时间:2011-05-23
希尔排序的复杂度理论上还无法计算出来,但肯定比插入小。
衡量算法的是平均复杂度,lz不要用某个例子来否定一个算法。 |
|
返回顶楼 | |
发表时间:2011-05-23
yizhilong28 写道 希尔排序的复杂度理论上还无法计算出来,但肯定比插入小。
衡量算法的是平均复杂度,lz不要用某个例子来否定一个算法。 嗯,明白 |
|
返回顶楼 | |
发表时间:2011-05-31
public void shellSort(Integer[] data, int group) { long start=System.currentTimeMillis(); for (int inc = data.length / group; inc > 0; inc /= 2) { for (int i = inc; i < data.length; i++) { int temp = data[i]; int j = i; for (; j >= inc && temp < data[j - inc]; j -= inc) { data[j] = data[j - inc]; } data[j] = temp; } } long end=System.currentTimeMillis(); System.out.println("shell:"+(end-start)); } Integer arr[]=new Integer[100000]; for(int i=0;i<100000;i++){ arr[i]=(int)(Math.random()*100000+1); } sSort.shellSort(arr,2); 怎么我的测了下shell明显快了很多,400毫秒左右,插入只支持到10000,否则慢得不行了。 |
|
返回顶楼 | |
发表时间:2011-06-01
没错,对数据的处理方式得看具体的环境和需求,各个算法都仅仅只是一种解决手段而已,我们要具体对待
|
|
返回顶楼 | |
发表时间:2011-06-01
典型得杀鸡有牛刀!
|
|
返回顶楼 | |