希尔排序:将相距某个”增量”的记录组成一个子序列,保证在子序列中分别进行直接插入排序后得到的结果基本有序而不是局部有序,不稳定 ,时间复杂度 O(n 3/2)

代码

  1. /**
  2. * @Description: 希尔排序:将相距某个”增量“的记录组成一个子序列,保证在子序列中分别进行直接插入排序后得到的结果基本有序而不是局部有序
  3. * 不稳定 ,时间复杂度 O(n 3/2)
  4. * @Author: lizhouwei
  5. * @CreateDate: 2018/6/23 10:50
  6. */
  7. public class ShellSort {
  8. public static void shellSort(Integer[] arr) {
  9. if (arr == null || arr.length == 0) {
  10. return;
  11. }
  12. SortUtil.printArray("希尔排序前", arr);
  13. int increment = arr.length;
  14. Integer temp;
  15. int j;
  16. do {
  17. increment = increment / 3 + 1;
  18. for (int i = increment; i < arr.length; i++) {
  19. if (arr[i] > arr[i - increment]) {
  20. continue;
  21. }
  22. temp = arr[i];
  23. for (j = i - increment; j >= 0 && temp < arr[j]; j = j - increment) {
  24. arr[j + increment] = arr[j];
  25. }
  26. arr[j + increment] = temp;
  27. }
  28. } while (increment > 1);
  29. SortUtil.printArray("希尔排序后", arr);
  30. }
  31. }

时间复杂度

时间复杂度为,由于记录时跳跃式的移动,所以希尔排序并不是一种稳定的排序算法