package org.wubo.test;
//_____________________________________________________________________________________
public class Demo {
public static void main(String[] args) {
int[] intarr={55,53,30,22,16,12,10,5,4};
int h=intarr.length;
int l=0;
System.out.println(ArrayOperate.mymax(intarr));
System.out.println(ArrayOperate.mymin(intarr));
//二分递归的调用
ArrayOperate.bS(intarr, l,h,31);
//二分while循环完成
System.out.println(ArrayOperate.erfenWhile(intarr,21 ));
//输出冒泡排序
System.out.println("冒泡排序方法:");
ArrayOperate.maopao(intarr);
//输出选择排序
System.out.println();
System.out.println("选择排序方法:");
ArrayOperate.xuanze(intarr);
//可以将ArrayOperate中的方法声明为静态的,使其成为静态类,成为工具类直接通过类名调用
/*ArrayOperate Arr=new ArrayOperate();
System.out.println(Arr.mymax(intarr));
System.out.println(Arr.mymin(intarr));
Arr.bS(intarr, l,h,31);
//1二分查找
System.out.println(Arr.erfenWhile(intarr,21 ));
//输出冒泡排序
System.out.println("冒泡排序方法:");
Arr.maopao(intarr);
//输出选择排序
System.out.println();
System.out.println("选择排序方法:");
Arr.xuanze(intarr);*/
}
}
//_____________________________________________________________________________________
/*1.编写一个类
* 2.实现选择排序
* 3.实现冒泡排序
* 4.实现二分查找
* 5.实现递归查找
* 6.换位置操作
* 7.求最大值
* 8.求最小值
* */
class ArrayOperate{
//1.数组遍历
public static void read(int[] arr){
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}
//2.实现求最大值
public static String mymax(int[] arr){
int max=arr[0];
for(int i=0;i<arr.length;i++){
if(arr[i]>max){
max=arr[i];
}
}
return "数组的最大值为:"+max;
}
//3.求数组最小值
public static String mymin(int[] arr){
int min=arr[0];
for(int i=0;i<arr.length;i++){
if(arr[i]<min){
min=arr[i];
}
}
return "数组的最小值为:"+min;
}
//4.交换方法
public static void swap(int[] arr,int a,int b){
int temp=arr[a];
arr[a]=arr[b];
arr[b]=temp;
}
//5.数组排序冒泡
public static void maopao(int[] arr){
for(int i=0;i<arr.length-1;i++){
for(int j=0;j<arr.length-1-i;j++){
if(arr[j]>arr[j+1]){
swap(arr,j,j+1);
}
}
}
read(arr);
}
//6.数组排序选择
public static void xuanze(int[] arr){
for(int i=0;i<arr.length-1;i++){
for(int j=i+1;j<arr.length;j++){
if(arr[j]<arr[i]){
swap(arr,j,i);
}
}
}
read(arr);
}
//7.二分查找while方式
public static String erfenWhile(int[] arr,int i){
int right=arr.length-1;
int left=0;
int mid;
mid=(left+right)/2;
if(arr[left]<i||arr[right]>i){
return"-1";
} else{
while(left<right){
if(arr[mid]<i){
right=mid-1;
}
if(arr[mid]>i){
left=mid+1;
}
mid=(left+right)/2;
}
if(arr[mid]==i){
return "要查找的元素"+i+"在数组中的第个"+(mid+1)+"位置";
}else{
if(i>arr[mid]){
if(arr[mid-1]-i>i-arr[mid]){
System.out.println("最近的数为:"+arr[mid]);
return "-2";
}else{
System.out.println("最近的数为:"+arr[mid-1]);
return "-1";
}
}else{
if(arr[mid]-i>i-arr[mid+1]){
System.out.println("最近的数为:"+arr[mid+1]);
return "-2";
}else{
System.out.println("最近的数为:"+arr[mid]);
return "-1";
}
}
}
}
}
//8.递归查找位置
public static void bS(int[] a, int low, int hig, int key) {
int mid = (low + hig) / 2;
// 二分法的要求是数组一开始就是排序好的
if (low > hig) {//说明两个下标往中间走 相互错过了,就表示没有找到这个key
System.out.println("没有这个数");
return;//直接return一下,为了不报StackOverflowError
}
if (a[mid] == key) {//要是找到直接打印即可
System.out.println("找到下标为" + mid);
return;
} else if (a[mid] >key) {//表示待查找的key在数组的右边,中间的mid对象的元素的值肯定不等于key
bS(a, mid + 1, hig, key);
} else {//表示待查找的key在数组的左边,中间的mid对象的元素的值肯定不等于key
bS(a, low, mid - 1, key);
}
}
}