点击查看希尔排序思路分析
希尔排序核心代码:
/**
* @Title: shellSort
* @Description: 希尔排序采用移动法即 先确定步长进行分段然后运用了简单插入排序法
* @param nums
*/
public static void shellSort(int nums[]) {
int count = 0; // 排序次数计量
// gap为步长;gap每次(/2)
for (int gap = nums.length / 2; gap > 0; gap /= 2) {
for (int i = gap; i < nums.length; i++) {
int j = i;
int temp = nums[j];
if (nums[j] < nums[j - gap]) {
while ((j - gap) >= 0 && temp < nums[j - gap]) {
nums[j] = nums[j - gap];
// 跳出循环
j -= gap;
}
// 当退出循环时 找到插入位置
nums[j] = temp;
}
}
}
}
/**
* @Title: shellSort2
* @Description: 希尔排序采用交换法
* @param nums
*/
public static void shellSort2(int nums[]) {
int count = 1; // 排序次数计量
int temp = 0; // 辅助变量
for (int gap = nums.length / 2; gap > 0; gap /= 2) {
for (int i = gap; i < nums.length; i++) {
// 遍历各组中的所有元素(共gap组每组2个元素)步长gap
for (int j = i - gap; j >= 0; j -= gap) {
// 如果当前元素大于加上步长gap后的元素,交换
if (nums[j] > nums[j + gap]) {
temp = nums[j];
nums[j] = nums[j + gap];
nums[j + gap] = temp;
}
}
}
}
}