1.  二分查找

 

/*排序并查找
对数组{1,3,9,5,6,7,15,4,8}进行排序,然后使用二分查找元素
6 并输出排序后的下标。*/
public class Array04 {

public static void main(String[] args) {
//二分查找的前提是:数组为有序数组,所以我们在二分查找之前,先给数组排序
int[] arr = { 1, 3, 9, 5, 6, 7, 15, 4, 8 };
maoPao(arr);
System.out.println("排序结果为:");
printArr(arr);
System.out.println("二分查找的下标为:" + binarySearch(arr, 6));

}
/**
* 这是冒泡排序
* @param arr
*/
public static void maoPao(int[] arr) {
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1);
}

}
}
}
/**
* 交换两个变量的值
* @param arr
* @param x
* @param y
*/
private static void swap(int[] arr, int x, int y) {

int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;

}
/**
* 二分查找
* @param arr
* @param key
* @return
*/
public static int binarySearch(int[] arr, int key) {
//定义三个变量,保存数组的最小,最大和中间索引
int max = arr.length - 1;
int min = 0;
int mid = 0;
//确定中间下标的前提,数组满足折半条件的时候,才能有中间下标
//开始循环折半
while(min<=max) {
//计算中间索引
mid=(min+max)/2;
if(key>arr[mid]) {
min=mid+1;
}else if(key<arr[mid]) {
max=mid-1;
}else{
return mid;
}
}
return -1;
}
/**
* 遍历打印数组
* @param arr
*/
public static void printArr(int[] arr) {
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
if (i < arr.length - 1) {
System.out.print(arr[i] + ",");
} else {
System.out.print(arr[i]);
}

}
System.out.println("]");
}
}

 

2.冒泡排序和选择排序

public class SelectSort {

    public static void main(String[] args) {
        int[] arr= {23,12,5,67,9,0,-1};
        //selectSort(arr);
        maoPao(arr);
        printArr(arr);

    }
    /**
     * 选择排序
     * @param arr
     */

    public static void selectSort(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            //每一个元素都要和他后面所有的元素进行比较
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[i] > arr[j]) {
                    swap(arr,i,j);
                }

            }

        }

    }
    /**
     * 冒泡排序:每完成一次排序,就会有一个最大值被找出来放到最后
     * @param arr
     */
    public static void maoPao(int[] arr) {
        for(int i=0;i<arr.length;i++) {
            //外层循环的次数就是已经排好序的原素个数,不必再将其循环排序
            for(int j=0;j<arr.length-i-1;j++) {
                if(arr[j]>arr[j+1]) {
                    swap(arr,j,j+1);
                }
                
            }
        }
        
    }
/**
 * 交换两个变量的值
 * @param arr
 * @param x
 * @param y
 */
private static void swap(int[] arr,int x,int y) {
    
                int temp=arr[x];
                arr[x]=arr[y];
                arr[y]=temp;
            
}
/**
 * 遍历打印数组
 * @param arr
 */
    public static void printArr(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            if (i < arr.length - 1) {
                System.out.print(arr[i] + ",");
            } else {
                System.out.print(arr[i]);
            }

        }
        System.out.println("]");
    }
}