版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
详解Shell排序
点关注不迷路,欢迎再访!
前面介绍的冒泡排序算法、选择排序算法和插入排序算法,虽然思路比较直观,但是排序的效率比较低。对于大量的数据需要排序时,往往需要寻求其他更为高效的排序算法。Shell排序算法便是其中的一种。
Shell排序算法严格来说基于插入排序的思路,其又称为希尔排序或者缩小增量排序。其排序流程如下:
1.将n个元素数组分成n/2个数字序列,第1个数据和第n/2+1个数据为一对…
2.一次循环使每一个序列对排好顺序。
3.然后,再变为n/4个序列,再次排序。
4.不断重复上述过程,随着序列减少最后变为一个,也就完成了整个排序。
public static void main(String[] args) {
int [] arr = {127,118,105,101,112,100};
int i,j,h;
int r,temp;
int x = 0;
for ( r = arr.length/2; r >= 1; r/=2) { //分解数组元素为多个序列
for ( i = r; i < arr.length; i++) {
temp = arr[i];
j = i-r;
while(j >= 0 && temp <arr[j]) {
arr[j+r] = arr[j];
j -= r;
}
arr[j+r] = temp;
}
x ++;
System.out.print("第"+x+"步排序结果:"); //输出每步排序的结果
for ( h = 0; h < arr.length; h++) {
System.out.print(" "+arr[h]);
}
System.out.print("\n");
}
}
排序后的数组结果:
第1步排序结果: 101 112 100 127 118 105
第2步排序结果: 100 101 105 112 118 127
在程序中使用了三重循环嵌套。最外层的循环用来分解数组元素为多个序列,每次比较两数的间距,直到其值为0就结束循环。下面一层循环按设置的间距r,分别比较对应的数组元素。在该循环中使用插入排序法对指定间距的元素进行排序。
从上面的例子可以非常直观地了解到Shell排序算法地执行过程。插入排序时,如果原数据已经时基本有序的,则排序的效率就可大大提高。另外,对于输了较小的序列使用直接插入排序,因需要移动的数据量较少,其效率也较高。因此,Shell排序算法具有比较高的执行效率。