一.算法描述
* 先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,具体算法描述:
* 选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;
* 按增量序列个数k,对序列进行k 趟排序;
* 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。
* 仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。
二.代码实现
private static void shellSort(int[] nums) {
int mid = (int) Math.floor(nums.length / 2);
for (; mid > 0; mid = (int) Math.floor(mid / 2)) {
for (int i = mid; i < nums.length; i++) {
int j = i;
int current = nums[i];
while (j - mid >= 0 && current < nums[j - mid]) {
nums[j] = nums[j - mid];
j = j - mid;
}
nums[j] = current;
}
}
}
三.复杂度分析
时间复杂度:平均:O(n1.3) 最坏:O(n²) 最好:O(n)
空间复杂度:O(1)
稳定性:不稳定