详解Shell排序

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_39443053/article/details/101384075

详解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排序算法具有比较高的执行效率。

猜你喜欢

转载自blog.csdn.net/qq_39443053/article/details/101384075