倒置数组元素查找--时间复杂度O(lgn)

前端之家收集整理的这篇文章主要介绍了倒置数组元素查找--时间复杂度O(lgn)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. /**
  2. *
  3. * @author jiadongkai
  4. * @date Dec 2,2011
  5. *
  6. */
  7. public class BinSearch {
  8. /**
  9. * 有序数组[1,2,3,4,5]
  10. * 折半查找arr数组中num的index,不存在返回-1
  11. * @param arr
  12. * @param num
  13. * @return
  14. */
  15. public static int binSearch(int[] arr,int num){
  16. int low = 0,high = arr.length-1;
  17. int mid = 0;
  18. while(low <= high){
  19. count++;
  20. mid = (low+high)/2;
  21. if(arr[mid] == num) return mid;
  22. if(arr[mid] < num)//合适的位置在后半部分
  23. low = mid + 1;
  24. else //合适的位置在前半部分
  25. high = mid - 1;
  26. }
  27. return -1;
  28. }
  29. static int count ;
  30. /**
  31. * [1,5]->[4,5,1,3]
  32. * 在倒置的数组中查找一个元素
  33. *
  34. * 选取mid之后,前后必有一半是有序的。比较low/mid-1和mid+1/high
  35. * 这两对位置的值就知道
  36. * 如果num落在有序的一半,
  37. * 接下来的查找都变成折半查找;如果num落在无序的一半,
  38. * @param arr
  39. * @param num
  40. * @return
  41. */
  42. public static int exBinSearch(int arr[],high = arr.length-1;
  43. int mid = 0;
  44. //用于标记num是否已经进入有序那一半
  45. //若进入,则下次直接使用折半查找的逻辑
  46. boolean flag = false;
  47. while(low <= high){
  48. count++;
  49. mid = (low + high)/2;
  50. if(arr[mid] == num) return mid;
  51. if( !flag && (arr[low] <= arr[mid-1])){
  52. //若前半部分有序
  53. if((arr[low] <= num) && (num <= arr[mid-1])){
  54. //若num落在有序的前半部分
  55. System.out.println("进入有序数组:"+(low)+" -> "+(mid-1));
  56. flag = true;
  57. high = mid -1;
  58. }else{
  59. //若num落在后半部分
  60. low = mid + 1;
  61. }
  62. continue;
  63. }
  64. if( !flag && arr[mid+1] <= arr[high]){
  65. //若后半部分有序
  66. if( (arr[mid+1] <= num) && (num <= arr[high])){
  67. //若num落在有序的后半部分
  68. System.out.println("进入有序数组:"+(mid+1)+" -> "+high);
  69. flag = true;
  70. low = mid+1;
  71. }else{
  72. //若num落在无序的前半部分
  73. high = mid - 1;
  74. }
  75. continue;
  76. }
  77. //能运行下面的逻辑,必然是已经确定num落在有序的部分了
  78. if( arr[mid] < num )
  79. low = mid + 1;
  80. else
  81. high = mid - 1;
  82. }
  83. return -1;
  84. }
  85. public static void main(String args[]){
  86. int arr[] = {1,6,7,8,9,10,22,34,56,67,89,100};
  87. int arr2[] = {67,100,56};
  88. int demo[] = {1,11,90,1000};
  89. for(int i : demo){
  90. System.out.println("---------比较i="+i+"-------------");
  91. System.out.println( i + "的index:" + binSearch(arr,i) );
  92. System.out.println("比较次数:"+count);
  93. count=0;
  94. System.out.println( i + "的index:" + exBinSearch(arr2,i));
  95. System.out.println("比较次数:"+count);
  96. }
  97.  
  98. }
  99. }

//~~~~

---------比较i=1------------- 1的index:0 比较次数:3 进入有序数组:3 -> 3 1的index:3 比较次数:4 ---------比较i=3------------- 3的index:1 比较次数:8 3的index:4 比较次数:3 ---------比较i=5------------- 5的index:2 比较次数:5 5的index:5 比较次数:4 ---------比较i=11------------- 11的index:-1 比较次数:8 进入有序数组:7 -> 13 11的index:-1 比较次数:4 ---------比较i=100------------- 100的index:13 比较次数:8 100的index:2 比较次数:2 ---------比较i=56------------- 56的index:10 比较次数:4 进入有序数组:7 -> 13 56的index:13 比较次数:4 ---------比较i=90------------- 90的index:-1 比较次数:8 90的index:-1 比较次数:4 ---------比较i=1000------------- 1000的index:-1 比较次数:8 1000的index:-1 比较次数:4

猜你在找的设计模式相关文章