PageRenderTime 43ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/org.hxzon.util/org/hxzon/util/sort/QuickSelect.java

https://gitlab.com/mstar-hxzon/mstar-mybatis-hxzon
Java | 87 lines | 66 code | 8 blank | 13 comment | 18 complexity | 5a474345296d7913e4c3ca9f0cc22d0c MD5 | raw file
  1. package org.hxzon.util.sort;
  2. import java.util.Comparator;
  3. public class QuickSelect {
  4. //private static int cutoff = 1;
  5. public static <T> void quickSelectMinK(T a[], int k, Comparator<T> comp) {
  6. quickSelectMinK(a, k, 0, a.length - 1, comp);
  7. }
  8. //QuickSelect 将第k小的元素放在 a[k-1]
  9. public static <T> void quickSelectMinK(T a[], int k, int left, int right, Comparator<T> comp) {
  10. if (left >= right) {
  11. return;
  12. }
  13. //取三数中值作为枢纽元,可以很大程度上避免最坏情况
  14. int vi = QuickSort.median3Index(a, left, right, (right + left) / 2, comp);
  15. //System.out.println("v:" + a[vi]);
  16. QuickSort.swap(a, left, vi);
  17. //
  18. int i = left + 1;
  19. int j = right;
  20. while (true) {
  21. while (comp.compare(a[j], a[left]) > 0) {
  22. j--;
  23. }
  24. while (comp.compare(a[i], a[left]) < 0) {
  25. i++;
  26. }
  27. if (i < j) {
  28. QuickSort.swap(a, i, j);
  29. i++;
  30. j--;
  31. } else {
  32. break;
  33. }
  34. }
  35. //重置枢纽元
  36. QuickSort.swap(a, left, i - 1);//vi=i-1
  37. //if k=vi or k=vi+1,is complete
  38. //
  39. if (k < i - 1) {//k<vi
  40. quickSelectMinK(a, k, left, i - 2, comp);//vi-1
  41. } else if (k > i) {//k>vi+1
  42. quickSelectMinK(a, k, i, right, comp);//vi+1
  43. }
  44. }
  45. //=====================
  46. public static <T> void quickSelectMinK_2(T a[], int k, Comparator<T> comp) {
  47. quickSelectMinK(a, k, 0, a.length - 1, comp);
  48. }
  49. //QuickSelect 将第k小的元素放在 a[k-1]
  50. public static <T> void quickSelectMinK_2(T a[], int k, int left, int right, Comparator<T> comp) {
  51. if (left >= right) {
  52. return;
  53. }
  54. //取三数中值作为枢纽元,可以很大程度上避免最坏情况
  55. int vi = QuickSort.median3Index(a, left, right, (right + left) / 2, comp);
  56. QuickSort.swap(a, vi, right);
  57. //
  58. int i = left - 1;
  59. int j = right;//begin form [right-1]
  60. while (true) {
  61. while (comp.compare(a[++i], a[right]) < 0) {
  62. }
  63. while (comp.compare(a[--j], a[right]) > 0) {
  64. }
  65. if (i < j) {
  66. QuickSort.swap(a, i, j);
  67. } else {
  68. break;
  69. }
  70. }
  71. //重置枢纽元
  72. QuickSort.swap(a, i, right);
  73. if (k <= i) {
  74. quickSelectMinK(a, k, left, i - 1, comp);
  75. } else if (k > i + 1) {
  76. quickSelectMinK(a, k, i + 1, right, comp);
  77. }
  78. }
  79. }