【排序】希尔排序模板
希尔排序又称缩小增量排序
1、先取定一个小于n的整数gap1作为第一个增量。把整个序列分成gap1组。全部距离为gap1的倍数的元素放在同一组中,在各组内分别进行排序(分组内採用直接插入排序或其他基本方式的排序)。(一般gap1为n/2。一次往后类推:gap2=gap/2,若为奇数,则gap2=(gap1+1)/2 gap1=(n+1)/2)
2、然后取第二个增量gap2<gap1,反复上述的分组和排序。
3、依此类推,直至增量gap=1。即全部元素放在同一组中进行排序为止。
public class SortMethods { /*输出数组中的元素*/ private static void print(int[] a) { for(int num: a){ System.out.print(num+"\t"); } System.out.println(); } private static void swap(int[] a, int i, int j) { int temp; temp =a[i]; a[i] = a[j]; a[j] = temp; } public static void main(String[] args) { int a[] = {0,21,25,49,25,16,15,8,-2,0,-9,67,34,5,12,40}; shellSort(a); print(a); } //希尔排序 private static void shellSort(int[] a) { //进行分组。初始步长设为数组长度的一半即n/2。然后依次减半,直到最后取1 for(int gap=(a.length+1)/2;gap>0;){ //组内排序 for(int i=0;i<a.length-gap;i++){//定位到每个元素 for(int j=i;j<a.length-gap;j+=gap){ if(a[j]>a[j+gap]){ swap(a,j,j+gap); } } } //for循环的修正(这里就是让奇数的加一后在二分,还有gap=1时。就是循环结束的时候。切要放在else里面否则最后gap=1不会进行排序的) if(gap>1){ gap = (gap+1)/2; }else if(gap==1){ break; } } } }