import java.util.Arrays;
/**
* java编程题:用Java实现一个希尔排序算法
*
* 基本思想: 首先将待排序的一组数按某个增量分为若干子序列,并对子序列分别进行插入排序。
* 然后逐渐将增量减小,并重复上述过程。直至增量为1,此时数据序列基本有序,最后进行一次插入排序。
*
*/
public class Test {
public static void main(String[] args) {
int[] sortNum = {3,82,18,-23,22,19,-62,6,28,31,37,55};
System.out.println("排序前:"+Arrays.toString(sortNum));
// shellSort(sortNum);
shellSort2(sortNum);
System.out.println("排序后:"+Arrays.toString(sortNum));
}
/**
* 希尔排序,写法一
*
* 思路:三层循环
* 第一层循环:控制增量-增量随着程序的进行依次递减一半
* 第二层循环:遍历数组
* 第三层循环:比较元素,交换元素。
* 这里需要注意的是:比较的两个元素和交换的两个元素是不同的。
*
* @param sortNum
*/
private static void shellSort(int[] sortNum) {
int temp = 0;
int j = 0;
// 每次将增量缩短一半
for (int increment = sortNum.length / 2; increment > 0; increment /= 2) { //比插入排序多了一层for
//插入排序
for (int i = increment; i < sortNum.length; i++) {
temp = sortNum[i]; //待插入元素
/*
for (j = i; j >= increment; j -= increment) {
if (temp < sortNum[j - increment]) { //若前面元素比待插入元素大,则交换位置
sortNum[j] = sortNum[j - increment];
} else {
break;
}
}
*/
//对于上面的for循环,还有更简洁的写法
for (j = i; j >= increment && temp < sortNum[j - increment]; j -= increment) {
sortNum[j] = sortNum[j - increment];
}
/*
* 注意不是arr[i] = temp
* 直接插入排序也是这样的。
* 为什么呢?
* 因为j是位置,i是待插入元素
*/
sortNum[j] = temp; //将元素插入到正确的位置
}
}
}
/**
* 希尔排序,写法二
*
* @param sortNum
*/
private static void shellSort2(int[] sortNum) {
int temp = 0;
int increment = sortNum.length;
while(true){
increment /= 2; // 如果数组长度是10的话,那么这里增量是5,3,1共进行三趟排序
for (int k = 0; k < increment; k++) {
//下面还是插入排序
for (int i = k+increment; i < sortNum.length; i+=increment) {
/*
for (int j = i; j > k; j-=increment) {
if(sortNum[j] < sortNum[j-increment]){
temp = sortNum[j-increment];
sortNum[j-increment] = sortNum[j];
sortNum[j] = temp;
}else{
break;
}
}
*/
//精简写法
for (int j = i; j > k && sortNum[j] < sortNum[j-increment]; j-=increment) {
temp = sortNum[j-increment];
sortNum[j-increment] = sortNum[j];
sortNum[j] = temp;
}
}
}
if(increment==1){
break;
}
}
}
}
参考:
http://computerdragon.blog.51cto.com/6235984/1161859
http://www.runoob.com/w3cnote/sort-algorithm-summary.html
http://www.cnblogs.com/0201zcr/p/4764427.html
https://my.oschina.net/u/2260184/blog/507857
http://blog.csdn.net/morewindows/article/details/6668714#quote
http://blog.csdn.net/jianyuerensheng/article/details/51258460
http://blog.csdn.net/u014136472/article/details/49248957
http://blog.csdn.net/ls5718/article/details/51809866
http://blog.csdn.net/u010156024/article/details/48932219