排序算法之希尔排序

 

  1. 基本介绍

    希尔排序是希尔在1959年提出的一种排序算法,也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也成为缩小增量排序

  2. 基本思想

    希尔排序是把记录按照下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分为一组,算法便终止

  3.  代码展示(下面代码中包括两种方式实现希尔排序,他们的排序速度有很大的区别,感兴趣的小伙伴可以自己亲自测一下)

package com.gcy.sort;

import java.util.Arrays;

import org.omg.CORBA.PUBLIC_MEMBER;

/**
* 希尔排序
* @author Administrator
*
*/
public class ShellSort {

public static void main(String[] args) {
int [] arr= {8,9,1,7,2,3,5,4,6,0};
System.out.println("排序前的数组"+Arrays.toString(arr));
//shellSort(arr);
shellSort2(arr);
System.out.println("排序后的数组"+Arrays.toString(arr));
}
/**
* 希尔排序交换法
* @param arr
*/
public static void shellSort(int [] arr) {
int temp=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;
}
}
}
}
}
/**
* 对交换式的希尔排序进行优化————》使用移位法
* @param arr
*/
public static void shellSort2(int [] arr) {
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;

}
}
}
}










//具体的分析
/*int temp=0;
//希尔排序第一轮排序
//因为第一轮排序,是将10个元素分成了5组
for(int i=5;i<arr.length;i++) {
for(int j=i-5;j>=0;j-=5) {
//如果当前元素大于加上步长后的元素,就需要交换
if(arr[j]>arr[j+5]) {
temp=arr[j];
arr[j]=arr[j+5];
arr[j+5]=temp;
}
}
}
System.out.println("希尔排序第一轮排序后"+Arrays.toString(arr));*/

}

结果:

 

posted @ 2020-10-04 23:31  IT特工  阅读(101)  评论(0编辑  收藏  举报