一、希尔排序
-
定义:
对于大规模的数组,插入排序很慢,因为它只能交换相邻的元素,每次只能将逆序数量减少 1。希尔排序的出现就是为了解决插入排序的这种局限性,它通过交换不相邻的元素,每次可以将逆序数量减少大于 1。
希尔排序使用插入排序对间隔 gap的序列进行排序。通过不断减小 gap,最后令 gap=1,就可以使得整个数组是有序的。
-
Java实现:
/**
* 希尔排序
* 第一个突破O(n2)的排序算法,是简单插入排序的改进版。
* 它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。
*/
public class ShellSort {
public static void main(String[] args) {
int[] a = RandomInt(20);
a = sort(a);
print(a);
}
//希尔排序
public static int[] sort(int[] num){
int l = num.length;
for (int gap=l/2;gap>0;gap--){
for(int i=0; i<l; i++){
if (i+gap < l){
if (num[i]>num[i+gap]){
swap(num,i,i+gap);
}
}else {
if (num[i]<num[i-gap]){
swap(num,i,i-gap);
}
}
}
}
return num;
}
//交换数据位置
public static void swap(int[] num, int a, int b){
int temp = num[a];
num[a] = num[b];
num[b] = temp;
}
//生成随机数组
public static int[] RandomInt(int size){
int [] list1 = new int[size];
for (int i = 0; i<size; i++){
list1[i] = Math.round((int)(Math.random() * 100));
}
return list1;
}
//输出全部数据
public static void print(int[] num){
for (int i = 0; i < num.length; i++){
System.out.print(" "+num[i]);
}
}
}
- 输出结果:
ShellSort
0 1 2 3 3 11 13 27 37 44 44 45 48 50 60 71 71 75 78 81
Process finished with exit code 0