1、题目要求

本次实验拟解决生活中最常见的问题之一:检索问题(查找问题),该问题要求在一个列表中查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1。根据列表中元素的相对大小信息,有顺序检索、二分检索、三分检索等算法思路可供参考使用,本次实验需要学生根据所给列表的性质采取有效算法解决相关问题,并能分析各个算法所使用的算法设计技术和时间复杂度。下列基本要求必须完成:
1、设计一个交互界面(例如菜单)供用户选择,如果可能,最好是一个图形化用户界面;
2、能够人工输入或随机产生一个长度为n的整数数组,要求数组任意两个元素都互不相同;
3、设计一个算法判断要求2中产生的整数数组是否为或未排序(输出0)、升序(输出1)、降序(输出2)、先升后降(输出3)、或先降后升(输出4)状态;
4、给定某具体元素,使用顺序检索算法判断该具体元素是否出现在要求2中产生的数组中,并统计关键字比较的次数;
5、给定某具体元素,使用二分检索算法判断该具体元素是否出现在要求2中产生的升序或降序的数组中,并统计关键字比较的次数;
6、给定某具体元素,使用三分检索算法判断该具体元素是否出现在要求2中产生的升序或降序的数组中,并统计关键字比较的次数;
7、给定先升后降(或先降后升)数组,使用二分检索思路查找该数组的最大值(或最小值),并统计关键字比较的次数。
附加:给定某具体元素,使用二分检索算法判断该具体元素是否出现在要求2中产生的升序或降序的数组中,若出现,返回具体元素所在的位置,否则,返回小于最接近该具体元素的位置。

2、具体实现

阉割版

  1. package com.exp2;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. import java.util.Arrays;
  6. import java.util.Scanner;
  7. /**
  8. * @author 郑万富
  9. * @className ArraySearch
  10. * @date 2021/11/22 12:33
  11. */
  12. @Data
  13. @NoArgsConstructor
  14. @AllArgsConstructor
  15. public class ArraySearch {
  16. private int[] data;
  17. public static void main(String[] args) {
  18. ArraySearch search = new ArraySearch();
  19. search.choice();
  20. }
  21. public void miniMenu() {
  22. System.out.println("|----------实验2:检索算法的实现--------|");
  23. System.out.println(" 1.手动初始化数组");
  24. System.out.println(" 2.随机初始化数组");
  25. System.out.println(" 3.数组排序状态");
  26. System.out.println(" 4.顺序检索算法");
  27. System.out.println(" 5.二分检索算法");
  28. System.out.println(" 6.三分检索算法");
  29. System.out.println(" 7.二分法查找最值");
  30. System.out.println(" 8.附加题验证");
  31. System.out.println(" 9.返回主菜单");
  32. System.out.println(" 0.退出程序");
  33. System.out.println("|-----------------------------------|");
  34. }
  35. public void MoreMenu() {
  36. System.out.println("|------------------------------------------------------实验2:检索算法的实现----------------------------------------------------------|");
  37. System.out.println(" 1.设计一个交互界面(例如菜单)供用户选择,如果可能,最好是一个图形化用户界面");
  38. System.out.println(" 2.能够人工输入或随机产生一个长度为n的整数数组,要求数组任意两个元素都互不相同");
  39. System.out.println(" 3.设计一个算法判断要求2中产生的整数数组是否为或未排序(输出0)、升序(输出1)、降序(输出2)、先升后降(输出3)、或先降后升(输出4)状态;");
  40. System.out.println(" 4.给定某具体元素,使用顺序检索算法判断该具体元素是否出现在要求2中产生的数组中,并统计关键字比较的次数;");
  41. System.out.println(" 5.给定某具体元素,使用二分检索算法判断该具体元素是否出现在要求2中产生的升序或降序的数组中,并统计关键字比较的次数;");
  42. System.out.println(" 6.给定某具体元素,使用三分检索算法判断该具体元素是否出现在要求2中产生的升序或降序的数组中,并统计关键字比较的次数;");
  43. System.out.println(" 7.给定先升后降(或先降后升)数组,使用二分检索思路查找该数组的最大值(或最小值),并统计关键字比较的次数。");
  44. System.out.println(" 8.给定某具体元素,使用二分检索算法判断该具体元素是否出现在要求2中产生的升序或降序的数组中,若出现,返回具体元素所在的位置,否则,返回小于最接近该具体元素的位置。");
  45. System.out.println("|---------------------------------------------------------------------------------------------------------------------------------|");
  46. }
  47. public void choice() {
  48. Scanner sc = new Scanner(System.in);
  49. ArraySearch array = new ArraySearch();
  50. while (true) {
  51. miniMenu();
  52. System.out.println("请输入你要执行的序号(0退出):");
  53. int choice = sc.nextInt();
  54. switch (choice) {
  55. case 1:
  56. array.setData(array.makeArray());
  57. continue;
  58. case 2:
  59. array.setData(array.makeArrayRandom());
  60. continue;
  61. case 3:
  62. int result = array.isSorted(array.getData());
  63. System.out.println(result);
  64. continue;
  65. case 4:
  66. System.out.println("请输入查找元素:");
  67. int num1 = sc.nextInt();
  68. System.out.println("关键字比较的次数:" + array.SequentialSearch(array.getData(), num1));
  69. continue;
  70. case 5:
  71. System.out.println("请输入查找元素:");
  72. int num2 = sc.nextInt();
  73. System.out.println("关键字比较的次数:" + array.BinarySearch(array.getData(), num2));
  74. continue;
  75. case 6:
  76. System.out.println("请输入查找元素:");
  77. int num3 = sc.nextInt();
  78. int index=array.threePointSearch(array.getData(), num3);
  79. System.out.println("索引位置" + index);
  80. if (index != -1) {
  81. System.out.println("查找成功");
  82. } else {
  83. System.out.println("查找失败");
  84. }
  85. continue;
  86. case 7:
  87. System.out.println("比较次数:" + array.binarySearchFindMaxAndMin(array.getData()));
  88. continue;
  89. case 8:
  90. System.out.println("请输入查找元素:");
  91. int num5 = sc.nextInt();
  92. System.out.println("最接近元素:");
  93. array.binarySearchFindClose(array.getData(), array.getData().length, num5, 0, array.getData().length);
  94. continue;
  95. case 9:
  96. MoreMenu();
  97. continue;
  98. case 0:
  99. System.out.println("正在退出程序...");
  100. break;
  101. default:
  102. System.out.println("输入错误,请重新输入:");
  103. continue;
  104. }
  105. break;
  106. }
  107. }
  108. //2、能够人工输入或随机产生一个长度为n的整数数组,要求数组任意两个元素都互不相同;
  109. public int[] makeArray() {
  110. Scanner sc = new Scanner(System.in);
  111. System.out.println("请输入数组长度:");
  112. int n = sc.nextInt();
  113. int[] array = new int[n];
  114. for (int i = 0; i < array.length; i++) {
  115. System.out.println("请输入数组第" + (i + 1) + "个元素:");
  116. array[i] = sc.nextInt();
  117. }
  118. System.out.println("数组为:" + Arrays.toString(array));
  119. return array;
  120. }
  121. public int[] makeArrayRandom() {
  122. Scanner sc = new Scanner(System.in);
  123. System.out.println("请输入数组长度:");
  124. int n = sc.nextInt();
  125. int[] array = new int[n];
  126. for (int i = 0; i < array.length; i++) {
  127. // System.out.println("请输入数组第" + (i + 1) + "个元素:");
  128. array[i] = (int) (Math.random() * 100);
  129. }
  130. System.out.println("数组为:" + Arrays.toString(array));
  131. return array;
  132. }
  133. //3、设计一个算法判断要求2中产生的整数数组是否为或未排序(输出0)、升序(输出1)、降序(输出2)、先升后降(输出3)、或先降后升(输出4)状态;
  134. public int isSorted(int[] arr) {
  135. //升序的个数,降序的个数
  136. int up_flag = 0, down_flag = 0;
  137. //是第一次升序还是降序
  138. boolean first_up = false, first_down = false;
  139. //用来判断数组中是否会出现多次波动。例如同时存在波峰和波底
  140. boolean flag = false;
  141. for (int i = 0; i < arr.length - 1; i++) {
  142. //判断第一个元素开始是升序还是降序(为了后面判断方便)
  143. if (!first_down && !first_up) {
  144. if (arr[i] < arr[i + 1]) {
  145. up_flag++;
  146. first_up = true;
  147. } else {
  148. first_down = true;
  149. down_flag++;
  150. }
  151. } else {
  152. //若是一开始降序的话,就只能为三种选项(无序,降序,先降后生)
  153. if (first_down) {
  154. if (arr[i] > arr[i + 1]) {
  155. down_flag++;
  156. //在下面代码中是升序才将flag置true,所以如果进入了升序再进入了降序判断代码,一定无序
  157. if (flag) {
  158. System.out.println("无序");
  159. return 0;
  160. }
  161. } else {
  162. if (!flag) {
  163. flag = true;
  164. }
  165. up_flag++;
  166. }
  167. } else if (first_up) {
  168. if (arr[i] < arr[i + 1]) {
  169. up_flag++;
  170. if (flag) {
  171. System.out.println("无序");
  172. return 0;
  173. }
  174. } else {
  175. if (!flag) {
  176. down_flag++;
  177. flag = true;
  178. }
  179. }
  180. }
  181. }
  182. }
  183. //此处可以不考虑无序,因为如果无序已经在for循环中return了
  184. if (down_flag == 0) {
  185. //若不存在降的元素,那只能是升序
  186. System.out.println("升序");
  187. return 1;
  188. } else if (up_flag == 0) {
  189. //若不存在升的元素,那只能是降序
  190. System.out.println("降序");
  191. return 2;
  192. } else if (first_down && up_flag != 0) {
  193. //若一开始为降,且升序元素不为0,说明绝对有波底
  194. System.out.println("先降后升");
  195. return 4;
  196. } else if (first_up && down_flag != 0) {
  197. //若一开始为升,且降序元素不为0,说明绝对有波峰
  198. System.out.println("先升后降");
  199. return 3;
  200. }
  201. return -1;
  202. }
  203. //4、给定某具体元素,使用顺序检索算法判断该具体元素是否出现在要求2中产生的数组中,并统计关键字比较的次数;
  204. public int SequentialSearch(int[] data, int target) {
  205. int count = 0;
  206. for (int i = 0; i < data.length; i++) {
  207. count++;
  208. if (target == data[i]) {
  209. System.out.println("该具体元素出现在要求2中产生的数组中");
  210. return count;
  211. } else {
  212. continue;
  213. // System.out.println("该具体元素没有出现在要求2中产生的数组中");
  214. }
  215. }
  216. System.out.println("该具体元素没有出现在要求2中产生的数组中");
  217. return count;
  218. }
  219. //5、给定某具体元素,使用二分检索算法判断该具体元素是否出现在要求2中产生的升序或降序的数组中,并统计关键字比较的次数;
  220. public int BinarySearch(int[] data, int target) {
  221. int flag = isSorted(data);
  222. int count = 0;
  223. if (flag == 1 || flag == 2) {
  224. System.out.println("该具体元素出现在要求2中产生的升序或降序的数组中");
  225. int l = 0, r = data.length - 1, mid;
  226. while (l <= r) {
  227. count++;
  228. //中间点
  229. mid = (l + r) >>> 1;
  230. if (target == data[mid]) {
  231. System.out.println("索引值:" + mid);
  232. return mid;
  233. } else if (target < data[mid]) {
  234. r = mid - 1;
  235. } else {
  236. l = mid + 1;
  237. }
  238. }
  239. } else {
  240. System.out.println("该具体元素没有出现在要求2中产生的升序或降序的数组中");
  241. }
  242. return count;
  243. }
  244. //逆序数组
  245. public static void reverse(int[] arr, int len) {
  246. int i, j, tmp, m;
  247. m = (len - 1) / 2;//结束的标志;
  248. for (i = 0; i <= m; i++) {
  249. j = len - 1 - i;
  250. tmp = arr[i];
  251. arr[i] = arr[j];
  252. arr[j] = tmp;
  253. }
  254. }
  255. //给定某具体元素,使用三分检索算法判断该具体元素是否出现在要求2中产生的升序或降序的数组中,并统计关键字比较的次数;
  256. public int threePointSearch(int[] temp, int key) {
  257. int flag = isSorted(data);
  258. System.out.println("flag:" + flag);
  259. int count = 0;
  260. int low = 0;
  261. int high = temp.length - 1;
  262. int mid1;
  263. int mid2;
  264. if (flag == 1) {//升序数组
  265. if (temp[low] > key || temp[high] < key || low > high) {
  266. return -1;
  267. }
  268. while (low <= high) {
  269. mid1 = 1 + (low + high) / 3;
  270. mid2 = 1 + (low + high) * 2 / 3;
  271. if (temp[low] == key) {
  272. return low;
  273. }
  274. if (temp[high] == key) {
  275. return high;
  276. }
  277. if (temp[mid1] == key) {
  278. return mid1;
  279. }
  280. if (temp[mid2] == key) {
  281. return mid2;
  282. }
  283. if (key < temp[mid1]) {
  284. high = mid1 - 1;
  285. }
  286. if (key > temp[mid2]) {
  287. low = mid2 + 1;
  288. }
  289. if (key > temp[mid1] && key < temp[mid2]) {
  290. low = mid1 + 1;
  291. high = mid2 - 1;
  292. }
  293. }
  294. } else if (flag == 2) {//降序数组
  295. if (temp[low] < key || temp[high] > key || low > high) {
  296. return -1;
  297. }
  298. reverse(temp, temp.length);
  299. int index1 = 0;
  300. System.out.println("反转数组:" + Arrays.toString(temp));
  301. for (int i = 0; i < temp.length; i++) {
  302. if (key == temp[i]) {
  303. index1 = i;
  304. }
  305. }
  306. System.out.println("index1:" + index1);
  307. while (low <= high) {
  308. mid1 = 1 + (low + high) / 3;
  309. mid2 = 1 + (low + high) * 2 / 3;
  310. if (temp[low] == key) {
  311. break;
  312. // return low ;
  313. }
  314. if (temp[high] == key) {
  315. break;
  316. // return high ;
  317. }
  318. if (temp[mid1] == key) {
  319. break;
  320. // return mid1 ;
  321. }
  322. if (temp[mid2] == key) {
  323. break;
  324. // return mid2 ;
  325. }
  326. if (key < temp[mid1]) {
  327. high = mid1 - 1;
  328. }
  329. if (key > temp[mid2]) {
  330. low = mid2 + 1;
  331. }
  332. if (key > temp[mid1] && key < temp[mid2]) {
  333. low = mid1 + 1;
  334. high = mid2 - 1;
  335. }
  336. }
  337. reverse(temp, temp.length);
  338. int index2 = 0;
  339. System.out.println("还原数组:" + Arrays.toString(temp));
  340. index2 = temp.length - index1 - 1;
  341. System.out.println("index2:" + index2);
  342. for (int i = 0; i < temp.length; i++) {
  343. count++;
  344. if (i == index2) {
  345. System.out.println("在数组中找到值:" + temp[i]);
  346. System.out.println("比较次数2:" + count);
  347. return index2;
  348. }
  349. }
  350. } else {
  351. System.out.println("不属于升序或降序的数组类型!");
  352. return -1;
  353. }
  354. return -1;
  355. }
  356. //7、给定先升后降(或先降后升)数组,使用二分检索思路查找该数组的最大值(或最小值),并统计关键字比较的次数。
  357. public static int getMax(int[] array) {
  358. int max = array[0];
  359. int i = 0;
  360. for (i = 0; i < array.length; i++) {
  361. if (array[i] >= max) {
  362. max = array[i];
  363. }
  364. }
  365. return max;
  366. }
  367. public static int getMin(int[] array) {
  368. int mix = array[0];
  369. int i = 0;
  370. for (i = 0; i < array.length; i++) {
  371. if (array[i] < mix) {
  372. mix = array[i];
  373. }
  374. }
  375. return mix;
  376. }
  377. public int binarySearchFindMaxAndMin(int[] data) {
  378. int flag = isSorted(data);
  379. int max = 0;
  380. int min = 0;
  381. int count = 0;
  382. if (flag == 3) {
  383. System.out.println("最值元素出现在要求2中产生的先升后降(或先降后升)数组中");
  384. max = getMax(data);
  385. int l = 0, r = data.length - 1, mid = 0;
  386. while (l <= r) {
  387. count++;
  388. mid = (l + r) >>> 1;
  389. if (max == data[mid]) {
  390. System.out.println("最大值:" + max);
  391. return count;
  392. } else if (max < data[mid]) {
  393. r = mid - 1;
  394. } else {
  395. l = mid + 1;
  396. }
  397. }
  398. } else if (flag == 4) {//先降后升
  399. System.out.println("最值元素出现在要求2中产生的先升后降(或先降后升)数组中");
  400. min = getMin(data);
  401. int l = 0, r = data.length - 1, mid = 0;
  402. while (l <= r) {
  403. count++;
  404. mid = (l + r) >>> 1;
  405. if (min == data[mid]) {
  406. System.out.println("最小值:" + min);
  407. return count;
  408. } else if (min < data[mid]) {
  409. l = mid + 1;
  410. } else {
  411. r = mid - 1;
  412. }
  413. }
  414. } else {
  415. System.out.println("最值元素没有出现在要求2中产生的先升后降(或先降后升)数组中");
  416. }
  417. // System.out.println("比较次数:" + count);
  418. return count;
  419. }
  420. //附加:给定某具体元素,使用二分检索算法判断该具体元素是否出现在要求2中产生的升序或降序的数组中,若出现,返回具体元素所在的位置,否则,返回小于最接近该具体元素的位置。
  421. public int binarySearchFindClose(int a[], int n, int target, int i, int j) {
  422. int left = 0;
  423. int right = n - 1;
  424. int mid;
  425. while (left <= right) {
  426. mid = (left + right) / 2;
  427. if (target == a[mid]) {
  428. i = mid;
  429. j = mid;
  430. System.out.println(a[mid]);
  431. System.out.println("索引值:" + mid);
  432. return mid;
  433. } else if (target > a[mid]) {
  434. left = mid + 1;
  435. } else {
  436. right = mid - 1;
  437. }
  438. }
  439. i = right;
  440. j = left;
  441. if (i < 0) {
  442. System.out.println(a[0]);
  443. System.out.println("最接近索引值:" + 0);
  444. } else if (j >= n) {
  445. System.out.println(a[n - 1]);
  446. } else {
  447. int l = (target - a[i]) > 0 ? (target - a[i]) : (-(target - a[i]));
  448. int r = (target - a[j]) > 0 ? (target - a[j]) : (-(target - a[j]));
  449. if (l < r) {
  450. System.out.println(a[n]);
  451. System.out.println("最接近索引值:" + n);
  452. } else if (l == r) {
  453. System.out.println(a[i]);
  454. System.out.println("最接近索引值:" + i);
  455. } else {
  456. System.out.println(a[i]);
  457. System.out.println("最接近索引值:" + i);
  458. }
  459. }
  460. return -1;
  461. }
  462. }

3. 验证程序所有功能

升序

  1. 请输入查找元素:
  2. 3
  3. |************--实验2:检索算法的实现--***************|
  4. * 1.初始数组数据 *
  5. * 2.判断数组状态 *
  6. * 3.顺序检索算法 *
  7. * 4.二分检索算法 *
  8. * 5.三分检索算法 *
  9. * 6.二分查找最值 *
  10. * 7.附加题目验证 *
  11. * 0.主动退出程序 *
  12. |************************************************|
  13. ------------------------------------By->2021-11-24
  14. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  15. 请输入你要执行的序号(0退出):
  16. 1
  17. 请选择初始化数组方式(1.手动初始化 2.随机初始化)
  18. 1
  19. 请输入数组长度:
  20. 8
  21. 1 3 5 7 9 11 12 13
  22. 数组为:[1, 3, 5, 7, 9, 11, 12, 13]
  23. |************--实验2:检索算法的实现--***************|
  24. * 1.初始数组数据 *
  25. * 2.判断数组状态 *
  26. * 3.顺序检索算法 *
  27. * 4.二分检索算法 *
  28. * 5.三分检索算法 *
  29. * 6.二分查找最值 *
  30. * 7.附加题目验证 *
  31. * 0.主动退出程序 *
  32. |************************************************|
  33. ------------------------------------By->2021-11-24
  34. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  35. 请输入你要执行的序号(0退出):
  36. 2
  37. 1
  38. |************--实验2:检索算法的实现--***************|
  39. * 1.初始数组数据 *
  40. * 2.判断数组状态 *
  41. * 3.顺序检索算法 *
  42. * 4.二分检索算法 *
  43. * 5.三分检索算法 *
  44. * 6.二分查找最值 *
  45. * 7.附加题目验证 *
  46. * 0.主动退出程序 *
  47. |************************************************|
  48. ------------------------------------By->2021-11-24
  49. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  50. 请输入你要执行的序号(0退出):
  51. 3
  52. 查找元素target:3
  53. 比较次数:2
  54. 1
  55. |************--实验2:检索算法的实现--***************|
  56. * 1.初始数组数据 *
  57. * 2.判断数组状态 *
  58. * 3.顺序检索算法 *
  59. * 4.二分检索算法 *
  60. * 5.三分检索算法 *
  61. * 6.二分查找最值 *
  62. * 7.附加题目验证 *
  63. * 0.主动退出程序 *
  64. |************************************************|
  65. ------------------------------------By->2021-11-24
  66. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  67. 请输入你要执行的序号(0退出):
  68. 4
  69. 查找元素target:3
  70. 比较次数:2
  71. 1
  72. |************--实验2:检索算法的实现--***************|
  73. * 1.初始数组数据 *
  74. * 2.判断数组状态 *
  75. * 3.顺序检索算法 *
  76. * 4.二分检索算法 *
  77. * 5.三分检索算法 *
  78. * 6.二分查找最值 *
  79. * 7.附加题目验证 *
  80. * 0.主动退出程序 *
  81. |************************************************|
  82. ------------------------------------By->2021-11-24
  83. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  84. 请输入你要执行的序号(0退出):
  85. 5
  86. 查找元素target:3
  87. 1
  88. |************--实验2:检索算法的实现--***************|
  89. * 1.初始数组数据 *
  90. * 2.判断数组状态 *
  91. * 3.顺序检索算法 *
  92. * 4.二分检索算法 *
  93. * 5.三分检索算法 *
  94. * 6.二分查找最值 *
  95. * 7.附加题目验证 *
  96. * 0.主动退出程序 *
  97. |************************************************|
  98. ------------------------------------By->2021-11-24
  99. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  100. 请输入你要执行的序号(0退出):
  101. 6
  102. 查找元素target:3
  103. 数组类型不是34
  104. -1
  105. |************--实验2:检索算法的实现--***************|
  106. * 1.初始数组数据 *
  107. * 2.判断数组状态 *
  108. * 3.顺序检索算法 *
  109. * 4.二分检索算法 *
  110. * 5.三分检索算法 *
  111. * 6.二分查找最值 *
  112. * 7.附加题目验证 *
  113. * 0.主动退出程序 *
  114. |************************************************|
  115. ------------------------------------By->2021-11-24
  116. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  117. 请输入你要执行的序号(0退出):
  118. 7
  119. 请输入附加题查找元素:
  120. 12
  121. 12
  122. 6
  123. |************--实验2:检索算法的实现--***************|
  124. * 1.初始数组数据 *
  125. * 2.判断数组状态 *
  126. * 3.顺序检索算法 *
  127. * 4.二分检索算法 *
  128. * 5.三分检索算法 *
  129. * 6.二分查找最值 *
  130. * 7.附加题目验证 *
  131. * 0.主动退出程序 *
  132. |************************************************|
  133. ------------------------------------By->2021-11-24
  134. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  135. 请输入你要执行的序号(0退出):
  136. 0
  137. 输入错误,正在退出...
  138. Process finished with exit code 0

降序

  1. 请输入查找元素:
  2. 6
  3. |************--实验2:检索算法的实现--***************|
  4. * 1.初始数组数据 *
  5. * 2.判断数组状态 *
  6. * 3.顺序检索算法 *
  7. * 4.二分检索算法 *
  8. * 5.三分检索算法 *
  9. * 6.二分查找最值 *
  10. * 7.附加题目验证 *
  11. * 0.主动退出程序 *
  12. |************************************************|
  13. ------------------------------------By->2021-11-24
  14. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  15. 请输入你要执行的序号(0退出):
  16. 1
  17. 请选择初始化数组方式(1.手动初始化 2.随机初始化)
  18. 1
  19. 请输入数组长度:
  20. 9
  21. 9 8 7 6 5 4 3 2 1
  22. 数组为:[9, 8, 7, 6, 5, 4, 3, 2, 1]
  23. |************--实验2:检索算法的实现--***************|
  24. * 1.初始数组数据 *
  25. * 2.判断数组状态 *
  26. * 3.顺序检索算法 *
  27. * 4.二分检索算法 *
  28. * 5.三分检索算法 *
  29. * 6.二分查找最值 *
  30. * 7.附加题目验证 *
  31. * 0.主动退出程序 *
  32. |************************************************|
  33. ------------------------------------By->2021-11-24
  34. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  35. 请输入你要执行的序号(0退出):
  36. 2
  37. 2
  38. |************--实验2:检索算法的实现--***************|
  39. * 1.初始数组数据 *
  40. * 2.判断数组状态 *
  41. * 3.顺序检索算法 *
  42. * 4.二分检索算法 *
  43. * 5.三分检索算法 *
  44. * 6.二分查找最值 *
  45. * 7.附加题目验证 *
  46. * 0.主动退出程序 *
  47. |************************************************|
  48. ------------------------------------By->2021-11-24
  49. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  50. 请输入你要执行的序号(0退出):
  51. 3
  52. 查找元素target:6
  53. 比较次数:4
  54. 3
  55. |************--实验2:检索算法的实现--***************|
  56. * 1.初始数组数据 *
  57. * 2.判断数组状态 *
  58. * 3.顺序检索算法 *
  59. * 4.二分检索算法 *
  60. * 5.三分检索算法 *
  61. * 6.二分查找最值 *
  62. * 7.附加题目验证 *
  63. * 0.主动退出程序 *
  64. |************************************************|
  65. ------------------------------------By->2021-11-24
  66. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  67. 请输入你要执行的序号(0退出):
  68. 4
  69. 查找元素target:6
  70. 比较次数:4
  71. 3
  72. |************--实验2:检索算法的实现--***************|
  73. * 1.初始数组数据 *
  74. * 2.判断数组状态 *
  75. * 3.顺序检索算法 *
  76. * 4.二分检索算法 *
  77. * 5.三分检索算法 *
  78. * 6.二分查找最值 *
  79. * 7.附加题目验证 *
  80. * 0.主动退出程序 *
  81. |************************************************|
  82. ------------------------------------By->2021-11-24
  83. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  84. 请输入你要执行的序号(0退出):
  85. 5
  86. 查找元素target:6
  87. 反转数组:[1, 2, 3, 4, 5, 6, 7, 8, 9]
  88. 对称位置:5
  89. 还原数组:[9, 8, 7, 6, 5, 4, 3, 2, 1]
  90. 真实位置:3
  91. 比较次数:4
  92. 3
  93. |************--实验2:检索算法的实现--***************|
  94. * 1.初始数组数据 *
  95. * 2.判断数组状态 *
  96. * 3.顺序检索算法 *
  97. * 4.二分检索算法 *
  98. * 5.三分检索算法 *
  99. * 6.二分查找最值 *
  100. * 7.附加题目验证 *
  101. * 0.主动退出程序 *
  102. |************************************************|
  103. ------------------------------------By->2021-11-24
  104. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  105. 请输入你要执行的序号(0退出):
  106. 6
  107. 查找元素target:6
  108. 数组类型不是34
  109. -1
  110. |************--实验2:检索算法的实现--***************|
  111. * 1.初始数组数据 *
  112. * 2.判断数组状态 *
  113. * 3.顺序检索算法 *
  114. * 4.二分检索算法 *
  115. * 5.三分检索算法 *
  116. * 6.二分查找最值 *
  117. * 7.附加题目验证 *
  118. * 0.主动退出程序 *
  119. |************************************************|
  120. ------------------------------------By->2021-11-24
  121. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  122. 请输入你要执行的序号(0退出):
  123. 7
  124. 请输入附加题查找元素:
  125. 4
  126. 4
  127. 5
  128. |************--实验2:检索算法的实现--***************|
  129. * 1.初始数组数据 *
  130. * 2.判断数组状态 *
  131. * 3.顺序检索算法 *
  132. * 4.二分检索算法 *
  133. * 5.三分检索算法 *
  134. * 6.二分查找最值 *
  135. * 7.附加题目验证 *
  136. * 0.主动退出程序 *
  137. |************************************************|
  138. ------------------------------------By->2021-11-24
  139. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  140. 请输入你要执行的序号(0退出):
  141. 0
  142. 输入错误,正在退出...
  143. Process finished with exit code 0

先升后降

  1. 请输入查找元素:
  2. 6
  3. |************--实验2:检索算法的实现--***************|
  4. * 1.初始数组数据 *
  5. * 2.判断数组状态 *
  6. * 3.顺序检索算法 *
  7. * 4.二分检索算法 *
  8. * 5.三分检索算法 *
  9. * 6.二分查找最值 *
  10. * 7.附加题目验证 *
  11. * 0.主动退出程序 *
  12. |************************************************|
  13. ------------------------------------By->2021-11-24
  14. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  15. 请输入你要执行的序号(0退出):
  16. 1
  17. 请选择初始化数组方式(1.手动初始化 2.随机初始化)
  18. 1
  19. 请输入数组长度:
  20. 10
  21. 1 3 5 7 9 8 6 4 2 0
  22. 数组为:[1, 3, 5, 7, 9, 8, 6, 4, 2, 0]
  23. |************--实验2:检索算法的实现--***************|
  24. * 1.初始数组数据 *
  25. * 2.判断数组状态 *
  26. * 3.顺序检索算法 *
  27. * 4.二分检索算法 *
  28. * 5.三分检索算法 *
  29. * 6.二分查找最值 *
  30. * 7.附加题目验证 *
  31. * 0.主动退出程序 *
  32. |************************************************|
  33. ------------------------------------By->2021-11-24
  34. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  35. 请输入你要执行的序号(0退出):
  36. 2
  37. 3
  38. |************--实验2:检索算法的实现--***************|
  39. * 1.初始数组数据 *
  40. * 2.判断数组状态 *
  41. * 3.顺序检索算法 *
  42. * 4.二分检索算法 *
  43. * 5.三分检索算法 *
  44. * 6.二分查找最值 *
  45. * 7.附加题目验证 *
  46. * 0.主动退出程序 *
  47. |************************************************|
  48. ------------------------------------By->2021-11-24
  49. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  50. 请输入你要执行的序号(0退出):
  51. 3
  52. 查找元素target:6
  53. 比较次数:7
  54. 6
  55. |************--实验2:检索算法的实现--***************|
  56. * 1.初始数组数据 *
  57. * 2.判断数组状态 *
  58. * 3.顺序检索算法 *
  59. * 4.二分检索算法 *
  60. * 5.三分检索算法 *
  61. * 6.二分查找最值 *
  62. * 7.附加题目验证 *
  63. * 0.主动退出程序 *
  64. |************************************************|
  65. ------------------------------------By->2021-11-24
  66. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  67. 请输入你要执行的序号(0退出):
  68. 4
  69. 查找元素target:6
  70. -1
  71. |************--实验2:检索算法的实现--***************|
  72. * 1.初始数组数据 *
  73. * 2.判断数组状态 *
  74. * 3.顺序检索算法 *
  75. * 4.二分检索算法 *
  76. * 5.三分检索算法 *
  77. * 6.二分查找最值 *
  78. * 7.附加题目验证 *
  79. * 0.主动退出程序 *
  80. |************************************************|
  81. ------------------------------------By->2021-11-24
  82. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  83. 请输入你要执行的序号(0退出):
  84. 5
  85. 查找元素target:6
  86. -1
  87. |************--实验2:检索算法的实现--***************|
  88. * 1.初始数组数据 *
  89. * 2.判断数组状态 *
  90. * 3.顺序检索算法 *
  91. * 4.二分检索算法 *
  92. * 5.三分检索算法 *
  93. * 6.二分查找最值 *
  94. * 7.附加题目验证 *
  95. * 0.主动退出程序 *
  96. |************************************************|
  97. ------------------------------------By->2021-11-24
  98. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  99. 请输入你要执行的序号(0退出):
  100. 6
  101. 查找元素target:6
  102. 比较次数1
  103. 最大值:9位置:
  104. 4
  105. |************--实验2:检索算法的实现--***************|
  106. * 1.初始数组数据 *
  107. * 2.判断数组状态 *
  108. * 3.顺序检索算法 *
  109. * 4.二分检索算法 *
  110. * 5.三分检索算法 *
  111. * 6.二分查找最值 *
  112. * 7.附加题目验证 *
  113. * 0.主动退出程序 *
  114. |************************************************|
  115. ------------------------------------By->2021-11-24
  116. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  117. 请输入你要执行的序号(0退出):
  118. 7
  119. 请输入附加题查找元素:
  120. 5
  121. -1
  122. |************--实验2:检索算法的实现--***************|
  123. * 1.初始数组数据 *
  124. * 2.判断数组状态 *
  125. * 3.顺序检索算法 *
  126. * 4.二分检索算法 *
  127. * 5.三分检索算法 *
  128. * 6.二分查找最值 *
  129. * 7.附加题目验证 *
  130. * 0.主动退出程序 *
  131. |************************************************|
  132. ------------------------------------By->2021-11-24
  133. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  134. 请输入你要执行的序号(0退出):
  135. 0
  136. 输入错误,正在退出...
  137. Process finished with exit code 0

先降后升

  1. 请输入查找元素:
  2. 3
  3. |************--实验2:检索算法的实现--***************|
  4. * 1.初始数组数据 *
  5. * 2.判断数组状态 *
  6. * 3.顺序检索算法 *
  7. * 4.二分检索算法 *
  8. * 5.三分检索算法 *
  9. * 6.二分查找最值 *
  10. * 7.附加题目验证 *
  11. * 0.主动退出程序 *
  12. |************************************************|
  13. ------------------------------------By->2021-11-24
  14. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  15. 请输入你要执行的序号(0退出):
  16. 1
  17. 请选择初始化数组方式(1.手动初始化 2.随机初始化)
  18. 1
  19. 请输入数组长度:
  20. 10
  21. 10 8 6 4 2 1 3 5 7 9
  22. 数组为:[10, 8, 6, 4, 2, 1, 3, 5, 7, 9]
  23. |************--实验2:检索算法的实现--***************|
  24. * 1.初始数组数据 *
  25. * 2.判断数组状态 *
  26. * 3.顺序检索算法 *
  27. * 4.二分检索算法 *
  28. * 5.三分检索算法 *
  29. * 6.二分查找最值 *
  30. * 7.附加题目验证 *
  31. * 0.主动退出程序 *
  32. |************************************************|
  33. ------------------------------------By->2021-11-24
  34. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  35. 请输入你要执行的序号(0退出):
  36. 2
  37. 4
  38. |************--实验2:检索算法的实现--***************|
  39. * 1.初始数组数据 *
  40. * 2.判断数组状态 *
  41. * 3.顺序检索算法 *
  42. * 4.二分检索算法 *
  43. * 5.三分检索算法 *
  44. * 6.二分查找最值 *
  45. * 7.附加题目验证 *
  46. * 0.主动退出程序 *
  47. |************************************************|
  48. ------------------------------------By->2021-11-24
  49. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  50. 请输入你要执行的序号(0退出):
  51. 3
  52. 查找元素target:3
  53. 比较次数:7
  54. 6
  55. |************--实验2:检索算法的实现--***************|
  56. * 1.初始数组数据 *
  57. * 2.判断数组状态 *
  58. * 3.顺序检索算法 *
  59. * 4.二分检索算法 *
  60. * 5.三分检索算法 *
  61. * 6.二分查找最值 *
  62. * 7.附加题目验证 *
  63. * 0.主动退出程序 *
  64. |************************************************|
  65. ------------------------------------By->2021-11-24
  66. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  67. 请输入你要执行的序号(0退出):
  68. 4
  69. 查找元素target:3
  70. -1
  71. |************--实验2:检索算法的实现--***************|
  72. * 1.初始数组数据 *
  73. * 2.判断数组状态 *
  74. * 3.顺序检索算法 *
  75. * 4.二分检索算法 *
  76. * 5.三分检索算法 *
  77. * 6.二分查找最值 *
  78. * 7.附加题目验证 *
  79. * 0.主动退出程序 *
  80. |************************************************|
  81. ------------------------------------By->2021-11-24
  82. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  83. 请输入你要执行的序号(0退出):
  84. 5
  85. 查找元素target:3
  86. -1
  87. |************--实验2:检索算法的实现--***************|
  88. * 1.初始数组数据 *
  89. * 2.判断数组状态 *
  90. * 3.顺序检索算法 *
  91. * 4.二分检索算法 *
  92. * 5.三分检索算法 *
  93. * 6.二分查找最值 *
  94. * 7.附加题目验证 *
  95. * 0.主动退出程序 *
  96. |************************************************|
  97. ------------------------------------By->2021-11-24
  98. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  99. 请输入你要执行的序号(0退出):
  100. 6
  101. 查找元素target:3
  102. 数组类型不是34
  103. -1
  104. |************--实验2:检索算法的实现--***************|
  105. * 1.初始数组数据 *
  106. * 2.判断数组状态 *
  107. * 3.顺序检索算法 *
  108. * 4.二分检索算法 *
  109. * 5.三分检索算法 *
  110. * 6.二分查找最值 *
  111. * 7.附加题目验证 *
  112. * 0.主动退出程序 *
  113. |************************************************|
  114. ------------------------------------By->2021-11-24
  115. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  116. 请输入你要执行的序号(0退出):
  117. 7
  118. 请输入附加题查找元素:
  119. 4
  120. -1
  121. |************--实验2:检索算法的实现--***************|
  122. * 1.初始数组数据 *
  123. * 2.判断数组状态 *
  124. * 3.顺序检索算法 *
  125. * 4.二分检索算法 *
  126. * 5.三分检索算法 *
  127. * 6.二分查找最值 *
  128. * 7.附加题目验证 *
  129. * 0.主动退出程序 *
  130. |************************************************|
  131. ------------------------------------By->2021-11-24
  132. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  133. 请输入你要执行的序号(0退出):
  134. 0
  135. 输入错误,正在退出...
  136. Process finished with exit code 0

无序

  1. 请输入查找元素:
  2. 5
  3. |************--实验2:检索算法的实现--***************|
  4. * 1.初始数组数据 *
  5. * 2.判断数组状态 *
  6. * 3.顺序检索算法 *
  7. * 4.二分检索算法 *
  8. * 5.三分检索算法 *
  9. * 6.二分查找最值 *
  10. * 7.附加题目验证 *
  11. * 0.主动退出程序 *
  12. |************************************************|
  13. ------------------------------------By->2021-11-24
  14. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  15. 请输入你要执行的序号(0退出):
  16. 1
  17. 请选择初始化数组方式(1.手动初始化 2.随机初始化)
  18. 2
  19. 请输入数组长度:
  20. 10
  21. 数组为:[32, 45, 65, 5, 75, 85, 18, 70, 46, 27]
  22. |************--实验2:检索算法的实现--***************|
  23. * 1.初始数组数据 *
  24. * 2.判断数组状态 *
  25. * 3.顺序检索算法 *
  26. * 4.二分检索算法 *
  27. * 5.三分检索算法 *
  28. * 6.二分查找最值 *
  29. * 7.附加题目验证 *
  30. * 0.主动退出程序 *
  31. |************************************************|
  32. ------------------------------------By->2021-11-24
  33. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  34. 请输入你要执行的序号(0退出):
  35. 2
  36. 0
  37. |************--实验2:检索算法的实现--***************|
  38. * 1.初始数组数据 *
  39. * 2.判断数组状态 *
  40. * 3.顺序检索算法 *
  41. * 4.二分检索算法 *
  42. * 5.三分检索算法 *
  43. * 6.二分查找最值 *
  44. * 7.附加题目验证 *
  45. * 0.主动退出程序 *
  46. |************************************************|
  47. ------------------------------------By->2021-11-24
  48. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  49. 请输入你要执行的序号(0退出):
  50. 3
  51. 查找元素target:5
  52. 比较次数:4
  53. 3
  54. |************--实验2:检索算法的实现--***************|
  55. * 1.初始数组数据 *
  56. * 2.判断数组状态 *
  57. * 3.顺序检索算法 *
  58. * 4.二分检索算法 *
  59. * 5.三分检索算法 *
  60. * 6.二分查找最值 *
  61. * 7.附加题目验证 *
  62. * 0.主动退出程序 *
  63. |************************************************|
  64. ------------------------------------By->2021-11-24
  65. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  66. 请输入你要执行的序号(0退出):
  67. 4
  68. 查找元素target:5
  69. -1
  70. |************--实验2:检索算法的实现--***************|
  71. * 1.初始数组数据 *
  72. * 2.判断数组状态 *
  73. * 3.顺序检索算法 *
  74. * 4.二分检索算法 *
  75. * 5.三分检索算法 *
  76. * 6.二分查找最值 *
  77. * 7.附加题目验证 *
  78. * 0.主动退出程序 *
  79. |************************************************|
  80. ------------------------------------By->2021-11-24
  81. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  82. 请输入你要执行的序号(0退出):
  83. 5
  84. 查找元素target:5
  85. -1
  86. |************--实验2:检索算法的实现--***************|
  87. * 1.初始数组数据 *
  88. * 2.判断数组状态 *
  89. * 3.顺序检索算法 *
  90. * 4.二分检索算法 *
  91. * 5.三分检索算法 *
  92. * 6.二分查找最值 *
  93. * 7.附加题目验证 *
  94. * 0.主动退出程序 *
  95. |************************************************|
  96. ------------------------------------By->2021-11-24
  97. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  98. 请输入你要执行的序号(0退出):
  99. 6
  100. 查找元素target:5
  101. 数组类型不是34
  102. -1
  103. |************--实验2:检索算法的实现--***************|
  104. * 1.初始数组数据 *
  105. * 2.判断数组状态 *
  106. * 3.顺序检索算法 *
  107. * 4.二分检索算法 *
  108. * 5.三分检索算法 *
  109. * 6.二分查找最值 *
  110. * 7.附加题目验证 *
  111. * 0.主动退出程序 *
  112. |************************************************|
  113. ------------------------------------By->2021-11-24
  114. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  115. 请输入你要执行的序号(0退出):
  116. 7
  117. 请输入附加题查找元素:
  118. 5
  119. -1
  120. |************--实验2:检索算法的实现--***************|
  121. * 1.初始数组数据 *
  122. * 2.判断数组状态 *
  123. * 3.顺序检索算法 *
  124. * 4.二分检索算法 *
  125. * 5.三分检索算法 *
  126. * 6.二分查找最值 *
  127. * 7.附加题目验证 *
  128. * 0.主动退出程序 *
  129. |************************************************|
  130. ------------------------------------By->2021-11-24
  131. PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)
  132. 请输入你要执行的序号(0退出):
  133. 0
  134. 输入错误,正在退出...
  135. Process finished with exit code 0

实现代码

  1. package com.exp2.hetong;
  2. import java.util.Arrays;
  3. import java.util.Scanner;
  4. /**
  5. * @author SearchAlgorithm
  6. */
  7. public class SearchAlgorithm {
  8. private int[] SearchArray;
  9. public int[] getSearchArray() {
  10. return SearchArray;
  11. }
  12. public void setSearchArray(int[] searchArray) {
  13. SearchArray = searchArray;
  14. }
  15. public static void main(String[] args) {
  16. SearchAlgorithm SearchAlgorithm = new SearchAlgorithm();
  17. SearchAlgorithm.menu();
  18. }
  19. public void menu() {
  20. Scanner sc = new Scanner(System.in);
  21. SearchAlgorithm SearchAlgorithm = new SearchAlgorithm();
  22. System.out.println("请输入查找元素:");
  23. int target = sc.nextInt();
  24. while (true) {
  25. System.out.println("|************--实验2:检索算法的实现--***************|");
  26. System.out.println(" * 1.初始数组数据 *");
  27. System.out.println(" * 2.判断数组状态 *");
  28. System.out.println(" * 3.顺序检索算法 *");
  29. System.out.println(" * 4.二分检索算法 *");
  30. System.out.println(" * 5.三分检索算法 *");
  31. System.out.println(" * 6.二分查找最值 *");
  32. System.out.println(" * 7.附加题目验证 *");
  33. System.out.println(" * 0.主动退出程序 *");
  34. System.out.println("|************************************************|");
  35. System.out.println("------------------------------------By->2021-11-24");
  36. System.out.println("PS:查找某个具体元素是否出现,若出现,返回具体元素在数组中的位置,否则返回-1(方法2除外)");
  37. System.out.println("请输入你要执行的序号(0退出):");
  38. int choice = sc.nextInt();
  39. switch (choice) {
  40. case 1:
  41. System.out.println("请选择初始化数组方式(1.手动初始化\t2.随机初始化)");
  42. int take = sc.nextInt();
  43. if (take == 1) {
  44. SearchAlgorithm.setSearchArray(initArrayByHand());
  45. } else if (take == 2) {
  46. SearchAlgorithm.setSearchArray(initArrayByRandom());
  47. } else {
  48. System.out.println("输入错误,返回菜单");
  49. }
  50. continue;
  51. case 2:
  52. System.out.println(isSorted(SearchAlgorithm.getSearchArray()));
  53. continue;
  54. case 3:
  55. System.out.println("查找元素target:" + target);
  56. System.out.println(SequentialSearch(SearchAlgorithm.getSearchArray(), target));
  57. continue;
  58. case 4:
  59. System.out.println("查找元素target:" + target);
  60. System.out.println(BinarySearch(SearchAlgorithm.getSearchArray(), target));
  61. continue;
  62. case 5:
  63. System.out.println("查找元素target:" + target);
  64. System.out.println(threePointSearch(SearchAlgorithm.getSearchArray(), target));
  65. continue;
  66. case 6:
  67. System.out.println("查找元素target:" + target);
  68. System.out.println(binarySearchFindMaxAndMin(SearchAlgorithm.getSearchArray()));
  69. continue;
  70. case 7:
  71. System.out.println("请输入附加题查找元素:");
  72. int find = sc.nextInt();
  73. System.out.println(binarySearchFindClose(SearchAlgorithm.getSearchArray(), SearchAlgorithm.getSearchArray().length, find, 0, SearchAlgorithm.getSearchArray().length));
  74. continue;
  75. default:
  76. System.out.println("输入错误,正在退出...");
  77. break;
  78. }
  79. break;
  80. }
  81. }
  82. //2、能够人工输入或随机产生一个长度为n的整数数组,要求数组任意两个元素都互不相同;
  83. public int[] initArrayByHand() {
  84. Scanner sc = new Scanner(System.in);
  85. System.out.println("请输入数组长度:");
  86. int n = sc.nextInt();
  87. int[] array = new int[n];
  88. for (int i = 0; i < array.length; i++) {
  89. array[i] = sc.nextInt();
  90. }
  91. System.out.println("数组为:" + Arrays.toString(array));
  92. return array;
  93. }
  94. public int[] initArrayByRandom() {
  95. Scanner sc = new Scanner(System.in);
  96. System.out.println("请输入数组长度:");
  97. int n = sc.nextInt();
  98. int[] array = new int[n];
  99. for (int i = 0; i < array.length; i++) {
  100. // System.out.println("请输入数组第" + (i + 1) + "个元素:");
  101. array[i] = (int) (Math.random() * 100);
  102. }
  103. System.out.println("数组为:" + Arrays.toString(array));
  104. return array;
  105. }
  106. //3、设计一个算法判断要求2中产生的整数数组是否为或未排序(输出0)、升序(输出1)、降序(输出2)、先升后降(输出3)、或先降后升(输出4)状态;
  107. public int isSorted(int[] arr) {
  108. //升序的个数,降序的个数
  109. int up_flag = 0, down_flag = 0;
  110. //是第一次升序还是降序
  111. boolean first_up = false, first_down = false;
  112. //用来判断数组中是否会出现多次波动。例如同时存在波峰和波底
  113. boolean flag = false;
  114. for (int i = 0; i < arr.length - 1; i++) {
  115. //判断第一个元素开始是升序还是降序(为了后面判断方便)
  116. if (!first_down && !first_up) {
  117. if (arr[i] < arr[i + 1]) {
  118. up_flag++;
  119. first_up = true;
  120. } else {
  121. first_down = true;
  122. down_flag++;
  123. }
  124. } else {
  125. //若是一开始降序的话,就只能为三种选项(无序,降序,先降后生)
  126. if (first_down) {
  127. if (arr[i] > arr[i + 1]) {
  128. down_flag++;
  129. //在下面代码中是升序才将flag置true,所以如果进入了升序再进入了降序判断代码,一定无序
  130. if (flag) {
  131. return 0;
  132. }
  133. } else {
  134. if (!flag) {
  135. flag = true;
  136. }
  137. up_flag++;
  138. }
  139. } else if (first_up) {
  140. if (arr[i] < arr[i + 1]) {
  141. up_flag++;
  142. if (flag) {
  143. return 0;
  144. }
  145. } else {
  146. if (!flag) {
  147. down_flag++;
  148. flag = true;
  149. }
  150. }
  151. }
  152. }
  153. }
  154. //此处可以不考虑无序,因为如果无序已经在for循环中return了
  155. if (down_flag == 0) {
  156. //若不存在降的元素,那只能是升序
  157. return 1;
  158. } else if (up_flag == 0) {
  159. //若不存在升的元素,那只能是降序
  160. return 2;
  161. } else if (first_down && up_flag != 0) {
  162. //若一开始为降,且升序元素不为0,说明绝对有波底
  163. return 4;
  164. } else if (first_up && down_flag != 0) {
  165. //若一开始为升,且降序元素不为0,说明绝对有波峰
  166. return 3;
  167. }
  168. return -1;
  169. }
  170. //4、给定某具体元素,使用顺序检索算法判断该具体元素是否出现在要求2中产生的数组中,并统计关键字比较的次数;
  171. public int SequentialSearch(int[] Searcharray, int target) {
  172. int count = 0;
  173. for (int i = 0; i < Searcharray.length; i++) {
  174. count++;
  175. if (target == Searcharray[i]) {
  176. System.out.println("比较次数:" + count);
  177. return i;
  178. }
  179. }
  180. return -1;
  181. }
  182. //5、给定某具体元素,使用二分检索算法判断该具体元素是否出现在要求2中产生的升序或降序的数组中,并统计关键字比较的次数;
  183. public int BinarySearch(int[] Searcharray, int target) {
  184. int flag = isSorted(Searcharray);
  185. int count = 0;
  186. //升序数组
  187. if (flag == 1 ) {
  188. int l = 0;
  189. int r = Searcharray.length - 1;
  190. int mid;
  191. while (l <= r) {
  192. count++;
  193. //中间点
  194. mid = (l + r) >>> 1;
  195. if (target == Searcharray[mid]) {
  196. System.out.println("比较次数:" + count);
  197. return mid;
  198. } else if (target < Searcharray[mid]) {
  199. r = mid - 1;
  200. } else {
  201. l = mid + 1;
  202. }
  203. }
  204. //处理降序数组
  205. }else if(flag==2){
  206. int l = 0;
  207. int r = Searcharray.length - 1;
  208. int mid;
  209. while (l <= r) {
  210. count++;
  211. //中间点
  212. mid = (l + r) >>> 1;
  213. if (target == Searcharray[mid]) {
  214. System.out.println("比较次数:" + count);
  215. return mid;
  216. } else if (target < Searcharray[mid]) {
  217. l = mid + 1;
  218. } else {
  219. r = mid - 1;
  220. }
  221. }
  222. }
  223. return -1;
  224. }
  225. //逆序数组
  226. public static void reverse(int[] arr, int len) {
  227. int i;
  228. int j;
  229. int tmp;
  230. int m;
  231. m = (len - 1) / 2;//结束的标志;
  232. for (i = 0; i <= m; i++) {
  233. j = len - 1 - i;
  234. tmp = arr[i];
  235. arr[i] = arr[j];
  236. arr[j] = tmp;
  237. }
  238. }
  239. //给定某具体元素,使用三分检索算法判断该具体元素是否出现在要求2中产生的升序或降序的数组中,并统计关键字比较的次数;
  240. public int threePointSearch(int[] temp, int key) {
  241. int flag = isSorted(temp);
  242. int count = 0;
  243. int low = 0;
  244. int high = temp.length - 1;
  245. int mid1;
  246. int mid2;
  247. if (flag == 1) {//升序数组
  248. if (temp[low] > key || temp[high] < key) {
  249. return -1;
  250. }
  251. while (low <= high) {
  252. mid1 = 1 + (low + high) / 3;
  253. mid2 = 1 + (low + high) * 2 / 3;
  254. if (temp[low] == key) {
  255. return low;
  256. }
  257. if (temp[high] == key) {
  258. return high;
  259. }
  260. if (temp[mid1] == key) {
  261. return mid1;
  262. }
  263. if (temp[mid2] == key) {
  264. return mid2;
  265. }
  266. if (key < temp[mid1]) {
  267. high = mid1 - 1;
  268. }
  269. if (key > temp[mid2]) {
  270. low = mid2 + 1;
  271. }
  272. if (key > temp[mid1] && key < temp[mid2]) {
  273. low = mid1 + 1;
  274. high = mid2 - 1;
  275. }
  276. }
  277. } else if (flag == 2) {//降序数组
  278. if (temp[low] < key || temp[high] > key || low > high) {
  279. return -1;
  280. }
  281. reverse(temp, temp.length);
  282. int index1 = 0;
  283. System.out.println("反转数组:" + Arrays.toString(temp));
  284. for (int i = 0; i < temp.length; i++) {
  285. if (key == temp[i]) {
  286. index1 = i;
  287. }
  288. }
  289. System.out.println("对称位置:" + index1);
  290. while (low <= high) {
  291. mid1 = 1 + (low + high) / 3;
  292. mid2 = 1 + (low + high) * 2 / 3;
  293. if (temp[low] == key) {
  294. break;
  295. // return low ;
  296. }
  297. if (temp[high] == key) {
  298. break;
  299. // return high ;
  300. }
  301. if (temp[mid1] == key) {
  302. break;
  303. // return mid1 ;
  304. }
  305. if (temp[mid2] == key) {
  306. break;
  307. // return mid2 ;
  308. }
  309. if (key < temp[mid1]) {
  310. high = mid1 - 1;
  311. }
  312. if (key > temp[mid2]) {
  313. low = mid2 + 1;
  314. }
  315. if (key > temp[mid1] && key < temp[mid2]) {
  316. low = mid1 + 1;
  317. high = mid2 - 1;
  318. }
  319. }
  320. reverse(temp, temp.length);
  321. int index2 = 0;
  322. System.out.println("还原数组:" + Arrays.toString(temp));
  323. index2 = temp.length - index1 - 1;
  324. System.out.println("真实位置:" + index2);
  325. for (int i = 0; i < temp.length; i++) {
  326. count++;
  327. if (i == index2) {
  328. System.out.println("比较次数:" + count);
  329. return index2;
  330. }
  331. }
  332. }
  333. return -1;
  334. }
  335. //7、给定先升后降(或先降后升)数组,使用二分检索思路查找该数组的最大值(或最小值),并统计关键字比较的次数。
  336. public static int getMax(int[] array) {
  337. int max = array[0];
  338. int i;
  339. for (i = 0; i < array.length; i++) {
  340. if (array[i] >= max) {
  341. max = array[i];
  342. }
  343. }
  344. return max;
  345. }
  346. public static int getMin(int[] array) {
  347. int mix = array[0];
  348. int i;
  349. for (i = 0; i < array.length; i++) {
  350. if (array[i] < mix) {
  351. mix = array[i];
  352. }
  353. }
  354. return mix;
  355. }
  356. public int binarySearchFindMaxAndMin(int[] Searcharray) {
  357. int flag = isSorted(Searcharray);
  358. int max = 0;
  359. int min = 0;
  360. int count = 0;
  361. if (flag == 3) {
  362. max = getMax(Searcharray);
  363. int l = 0;
  364. int r = Searcharray.length - 1;
  365. int mid = 0;
  366. while (l <= r) {
  367. count++;
  368. mid = (l + r) >>> 1;
  369. if (max == Searcharray[mid]) {
  370. System.out.println("比较次数" + count);
  371. System.out.println("最大值:" + max + "位置:");
  372. return mid;
  373. } else if (max < Searcharray[mid]) {
  374. r = mid - 1;
  375. } else {
  376. l = mid + 1;
  377. }
  378. }
  379. } else if (flag == 4) {//先降后升
  380. min = getMin(Searcharray);
  381. int l = 0;
  382. int r = Searcharray.length - 1;
  383. int mid = 0;
  384. while (l <= r) {
  385. count++;
  386. mid = (l + r) >>> 1;
  387. if (min == Searcharray[mid]) {
  388. System.out.println("比较次数:" + count);
  389. System.out.println("最小值:" + min + "位置:");
  390. return mid;
  391. } else if (min < Searcharray[mid]) {
  392. l = mid + 1;
  393. } else {
  394. r = mid - 1;
  395. }
  396. }
  397. }
  398. System.out.println("数组类型不是3或4");
  399. return -1;
  400. }
  401. //附加:给定某具体元素,使用二分检索算法判断该具体元素是否出现在要求2中产生的升序或降序的数组中,若出现,返回具体元素所在的位置,否则,返回小于最接近该具体元素的位置。
  402. public int binarySearchFindClose(int a[], int n, int target, int i, int j) {
  403. int flag=isSorted(a);
  404. //处理升序
  405. if (flag==1){
  406. int left = 0;
  407. int right = n - 1;
  408. int mid;
  409. while (left <= right) {
  410. mid = (left + right) / 2;
  411. if (target == a[mid]) {
  412. i = mid;
  413. j = mid;
  414. System.out.println(a[mid]);
  415. return mid;
  416. } else if (target > a[mid]) {
  417. left = mid + 1;
  418. } else {
  419. right = mid - 1;
  420. }
  421. }
  422. i = right;
  423. j = left;
  424. if (i < 0) {
  425. System.out.println(a[0]);
  426. System.out.println("最接近索引值:" + 0);
  427. } else if (j >= n) {
  428. System.out.println(a[n - 1]);
  429. } else {
  430. int l = (target - a[i]) > 0 ? (target - a[i]) : (-(target - a[i]));
  431. int r = (target - a[j]) > 0 ? (target - a[j]) : (-(target - a[j]));
  432. if (l < r) {
  433. System.out.println(a[n]);
  434. System.out.println("最接近索引值:" + n);
  435. } else if (l == r) {
  436. System.out.println(a[i]);
  437. System.out.println("最接近索引值:" + i);
  438. } else {
  439. System.out.println(a[i]);
  440. System.out.println("最接近索引值:" + i);
  441. }
  442. }
  443. }else if(flag==2){
  444. int left = 0;
  445. int right = n - 1;
  446. int mid;
  447. while (left <= right) {
  448. mid = (left + right) / 2;
  449. if (target == a[mid]) {
  450. i = mid;
  451. j = mid;
  452. System.out.println(a[mid]);
  453. return mid;
  454. } else if (target > a[mid]) {
  455. right = mid - 1;
  456. } else {
  457. left = mid + 1;
  458. }
  459. }
  460. i = right; //大-->小值索引
  461. j = left; //小-->大值做因
  462. if (j < 0) {
  463. System.out.println(a[0]);
  464. System.out.println("最接近索引值:" + 0);
  465. } else if (i >= n) {
  466. System.out.println(a[n - 1]);
  467. } else {
  468. int l = (target - a[j]) > 0 ? (target - a[j]) : (-(target - a[j]));
  469. int r = (target - a[i]) > 0 ? (target - a[i]) : (-(target - a[i]));
  470. if (l < r) {
  471. System.out.println(a[0]);
  472. System.out.println("最接近索引值:" + 0);
  473. } else if (l == r) {
  474. System.out.println(a[j]);
  475. System.out.println("最接近索引值:" + j);
  476. } else {
  477. System.out.println(a[j]);
  478. System.out.println("最接近索引值:" + j);
  479. }
  480. }
  481. }
  482. return -1;
  483. }
  484. }