论坛首页 综合技术论坛

希尔排序和插入排序,哪个更快些

浏览 11647 次
精华帖 (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;
}
}

谢谢,的确要考虑数字的随机性
0 请登录后投票
   发表时间:2011-05-21  
ujnlu 写道
其实希尔就是改进的插入排序。
速度根据数据初始的结构来的 还有距离因素,如果两个数据之间相差不大 希尔比插入好不了哪里去

对于数据量非常大的时候,希尔排序是要比插入排序高效。不过对于数据量很大的时候,一般都用快排了。
0 请登录后投票
   发表时间:2011-05-23  
希尔排序的复杂度理论上还无法计算出来,但肯定比插入小。
衡量算法的是平均复杂度,lz不要用某个例子来否定一个算法。
0 请登录后投票
   发表时间:2011-05-23  
yizhilong28 写道
希尔排序的复杂度理论上还无法计算出来,但肯定比插入小。
衡量算法的是平均复杂度,lz不要用某个例子来否定一个算法。

嗯,明白
0 请登录后投票
   发表时间: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,否则慢得不行了。
0 请登录后投票
   发表时间:2011-06-01  
没错,对数据的处理方式得看具体的环境和需求,各个算法都仅仅只是一种解决手段而已,我们要具体对待
0 请登录后投票
   发表时间:2011-06-01  
典型得杀鸡有牛刀!
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics