题目
给一组整数,按照升序排序,使用选择排序,冒泡排序,插入排序或者任何 O(n2) 的排序算法。
样例
对于数组 [3, 2, 1, 4, 5], 排序后为:[1, 2, 3, 4, 5]。
希尔排序
希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
详细讲解戳这里百度百科
代码
public class Solution {
/**
* @param A an integer array
* @return void
*/
public void sortIntegers(int[] A) {
int d = A.length;
if (d <= 1) return;//过滤为空或者长度为1的数组
while (true){//一直循环直到增量为1
d = d/2;//每次增量缩小的比列,一般取一半,如果刚开始增量缩小的太小,容易造成超时,例如 d = d/5
for(int x=0; x<d; x++){//从第0个开始循环,循环一组,即到增量的大小
for (int i = x+d; i<A.length; i= i+d){//根据增量大小选出每组
int temp = A[i];
int j;
//将每组的数据选中的那个和他前面的进行比较,如果前面的数字大则进行交换,注意这里是j>=0
for (j = i-d; j>=0&&A[j]>temp; j = j-d){
A[j+d] = A[j];
}
//因为每次j = j-d,所以循环后j要加d 才是要交换的那个
A[j+d] = temp;
}
}
if (d == 1){
break;
}
}
}
}