您的位置:首页 > 编程语言 > Java开发

Java -- 算法小结之希尔排序

2015-06-28 10:14 1071 查看
希尔排序是在插入排序的基础之上做的优化。那什么是希尔排序呢?

我们知道,再插入排序的时候,如果这个数组基本是有序的,那么数组间数值的移动就会少很多,那么相应的效率就会提高。

希尔的规则是将已有的数组分成几个长度比较小的数组,因为再长度比较小的数组里,数组基本是有序的。

但是有一个缺点就是希尔排序是不稳定的。

我们看一下如何具体的来做希尔排序,源码已经上传到我的GitHub

(1)按照给定的步长来确定我的分组,比如步长为5,那么第一组就是下标为 0 5 10 … 这些数组成,第二组就是 1 6 11 … 等

(2)将分好的组分别做插入排序

(3)将步长适当减小(最后一次的步长必须是1),重复步骤 1 2。

大致的过程就是这个了,下面贴代码

public class ShellSort {

/**
* 交换数据里面的两数
* @param list 需要交换数据的列表
* @param m 交换的数据之一
* @param n 另一个需要交换的数
*/
public static void swap(int[] list , int m , int n) {
int temp = list
;
list
= list[m];
list[m] = temp;
}

/**
* 根据相应步长来做一次插入排序
* @param list 需要排序的数组
* @param t 步长
*/
public static void shellsort(int[] list , int t) {
System.out.println("t = " + t );
for(int i = 0 ; i < t ; i++ ) {
for(int j = i ; j < list.length ; j += t) {
int p = j;
for( int m = j ; m >=0 ; m -= t ) {
if( list[m] > list[p] ) {
swap(list,m,p);
p = m ;
}
}
}
System.out.println(Arrays.toString(list));
}
}

public static void main(String[] args) {
int[] test = {23,44,2,3,11,46,38,5,9,88,5,22};
System.out.println(Arrays.toString(test));
int t = test.length ;
do {
if( 1 != t ) {
t /= 2;
}
shellsort(test, t);
} while( t > 1 ) ;
if( 1 != t ) {
shellsort(test,1);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  希尔排序