1. //对交换式的希尔排序进行优化->移位法
  2. public static void shellSort2(int[] arr) {
  3. // 增量gap, 并逐步的缩小增量
  4. for (int gap = arr.length / 2; gap > 0; gap /= 2) {
  5. // 从第gap个元素,逐个对其所在的组进行直接插入排序
  6. for (int i = gap; i < arr.length; i++) {
  7. int j = i;
  8. int temp = arr[j];
  9. if (arr[j] < arr[j - gap]) {
  10. while (j - gap >= 0 && temp < arr[j - gap]) {
  11. //移动
  12. arr[j] = arr[j-gap];
  13. j -= gap;
  14. }
  15. //当退出while后,就给temp找到插入的位置
  16. arr[j] = temp;
  17. }
  18. }
  19. }
  20. }

交换法中,每次排序都存在交换两个逆序数据的行为。如[5,6,8,4]其中元素4要交换到前面需要先和元素8交换,再和元素6交换,最后和元素5交换,更换到最前面。
假设有大量数据,而最后一个数据为最小数据,因此要交换至最前面,那么就需要和每一个数据交换,会产生大量运算。而移位法不需要。

若最后有一个小数,交换法,要循环比较,并挨个交换,直到交换到最前面

而移位法,直接找到前面的位置,并将其他数字都往后面移位

移位用了一层循环中的操作就实现了,交换不仅要循环一次,还要交换n次

希尔NB

就是这么效率
算法的魅力!!!