7大常用排序算法——Shell希尔排序(替换法ok,移动法待理解)

五迷三道 提交于 2020-08-04 23:09:14

概述:希尔排序的由来。由于【插入】排序每次位移数组插入值时会影响效率,如下表。

所以希尔排序是在插入排序的基础上,对插入排序进行优化的一种排序算法。亦称‘缩小增量排序’。

 

希尔排序思路:

1、按数组长度的下标进行‘增量’分组,若增量不为1,则将分组的数组进行一次排序。

2、直到‘增量’为1时停止分组,同时进行最后一次排序。

(也就是除以‘增量’,分成几组、分成只有‘增量为1’的组数的时候才停止分组,同时再将全部分组当做一组数组进行排序)

替换法 代码实现:

public class ShellSortOfTeacher {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int [] arr = {8,9,1,7,2,3,5,4,6,0};
		System.out.println("希尔排序前的数组为=" + Arrays.toString(arr));
		shellsort(arr);
	}
	
	//交换式的shell排序法。
	
	public static void shellsort(int arr[]) {
		int temp = 0;
		int count = 0;
		for(int gap = arr.length / 2;gap > 0;gap /= 2) {
				for(int i = gap; i < arr.length ; i++) {	//将数组的长度分为‘增量‘组
					
					for(int j = i - gap; j >= 0; j -= gap) {
						if(arr[j] > arr[j+gap]) {
							temp = arr[j];
							arr[j] = arr[j+gap];
							arr[j+gap] = temp;
						}
					}
					
				}
		}
		System.out.println("实现了第" + ++count + "次希尔排序后的数组为=" + Arrays.toString(arr));
	}

}

移动法 代码实现:

	public static void shellsort2(int arr []) {
		
		//增量gap,并逐步的缩小增量
		for(int gap = arr.length / 2; gap > 0; gap /= 2) {
			//从第gap个元素,逐个对其所在的组进行直接插入排序
			for(int i = gap; i < arr.length; i++) {
				int j =i;
				int temp = arr[j];
				if(arr[j] < arr[j - gap]) {
					while(j - gap >= 0 && temp < arr[j - gap]) {
						//移动
						arr[j] = arr[j - gap];
						j -= gap;
					}
					//当退出while后,就给temp找到插入的位置
					arr[j] = temp;
				}
			}
		}
	}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!