简单插入排序可能会出现的问题

显而易见,当大多数的数已经排序好,只有小的数在最后面的时候,插入排序的效率是非常低的。
希尔排序介绍
希尔排序是希尔于1959年题出的一种排序算法,希尔排序也是一种插入排序,他是简单插入
希尔排序是把序列按一定间隔分组,对每组使用直接插入排序;随着间隔减小,一直到1,使得整个序列有序
时间复杂度:O(nlogn)
稳定度:不稳定
思路:
1)将数组进行分组,
第一次分组 组数为 gap = arr.length/2,
接下来的分组 组数为 gap/2,循环直到组数为1
2)获得分组,只需遍历一半的元素,就可以获得再其中小组的成员
for(int i = gap;i<arr.length;i++) {
判断小组中成员的大小,小放前,大放后
交换法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
public static void shellSort(int[] arr) { int count = 0; int temp; for (int gap = arr.length / 2; gap > 0; gap /= 2) { for (int i = gap; i < arr.length; i++) { for (int j = i - gap; j >= 0; j -= gap) { if (arr[j] > arr[j + gap]) { temp = arr[j]; arr[j] = arr[j + gap]; arr[j + gap] = temp; } } } }
}
|
缩小增量法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
public void shellSort3(int[] arr) { for (int gap = arr.length / 2; gap > 0; gap /= 2) { for (int i = 0; i < gap; i++) { for (int j = i;j<arr.length - gap;j+=gap){ int insert = arr[j + gap]; int insetIndex = j;
while (insetIndex>=0 && insert < arr[insetIndex]) { arr[insetIndex + gap] = arr[insetIndex]; insetIndex -= gap; } arr[insetIndex+gap] = insert; } }
} }
|