import java.util.Map;
import java.util.Scanner;
public class RandomArray {
public static void main(String[] args) {
int arr[] = new int[10];
//随机生成数组
Tools.randomArr(arr, arr.length);
Tools.syso("随机生成的数组:", arr);
System.out.println();
//将数组随机排列
Tools.sort(arr);
Tools.syso("随机排列后的数组:", arr);
//排序数组
Tools.qSort(arr, 0, arr.length-1);
System.out.println();
Tools.syso("排序后的数组:", arr);
System.out.println();
//查找元素x
System.out.println("请输入要查找的数据:");
int x = new Scanner(System.in).nextInt();
Map<Integer, Integer> map = Tools.binarySearch(arr, x);
if(map.size() > 1){
System.out.println("没有找到!!!");
int left = map.get(Tools.LEFT);
int right = map.get(Tools.RIGHT);
System.out.println("小于" + x + "的最大元素位置:"+ (left+1) + "\n大于" + x + "的最小元素位置:" + (right+1));
}
else
System.out.println("您所查找元素"+ x + "的位置是:" + map.get(Tools.INDEX));
}
}
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Random;
class Tools {
public static final Integer INDEX = 1;
public static final Integer LEFT = -2;
public static final Integer RIGHT = -1;
/**
* 随机数生成数组[1:100]
*
* @param arr
* @param n
*/
public static void randomArr(int arr[], int n) {
Random random = new Random();
for (int i = 0; i < n; i++) {
arr[i] = random.nextInt(100) + 1;
}
}
/**
* 将数组元素随机排列
*
* @param arr
*/
public static void sort(int arr[]) {
HashSet<Integer> set = new HashSet<Integer>();
for (int i = 0; i < arr.length; i++) {
set.add(arr[i]);
}
int i = 0;
Iterator<Integer> it = set.iterator();
while (it.hasNext()) {
arr[i++] = it.next();
}
}
/**
* 快速排序算法
*
* @param p
* @param r
*/
public static void qSort(int arr[], int p, int r) {
if (p < r) {
int q = partiton(arr, p, r);
qSort(arr, p, q - 1);
qSort(arr, q + 1, r);
}
}
private static int partiton(int arr[], int p, int r) {
int i = p;
int j = r + 1;
int x = arr[p];
while (true) {
while (arr[++i] < x && i < r)
;
while (arr[--j] > x)
;
if (i >= j) {
break;
}
Tools.swap(arr, i, j);
}
arr[p] = arr[j];
arr[j] = x;
return j;
}
/**
* 交换数据
*
* @param arr
* @param i
* @param j
*/
private static void swap(int arr[], int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
/**
* 二分查找算法: 当搜索元素x不存在时,返回小于x的最大元素位置i和大于x的最小元素位置j.
* 当搜索元素在数组中时,i和j相同,均为x在数组中的位置。
*
* @param arr
*/
public static Map<Integer, Integer> binarySearch(int arr[], int x) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
int start = 0;
int end = arr.length - 1;
while (start <= end) {
int middle = (start + end) / 2;
if (x == arr[middle]) {
map.put(INDEX, middle);
return map;
} else if (x > arr[middle]) {
start = middle + 1;
} else {
end = middle - 1;
}
}
/**
* 循环退出条件:start > end 没有找到x,返回小于x的最大元素位置LEFT和大于x的最小元素位置RIGHT
*/
map.put(LEFT, end);
map.put(RIGHT, start);
return map;
}
/**
* 打印数组
*
* @param arr
*/
public static void syso(String msg, int arr[]) {
System.out.println(msg);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}