数组相关算法(冒泡排序、选择排序、二分查找)

1、冒泡排序

冒泡由小到大排序思路:从前向后进行两两比较,如果前面的数大于后面的数就交换。

package cn.lwj0126.javase.array.test;
//冒泡排序
public class BubbleSorting {
    public static void main(String[] args) {
        int[] data = {77,44,66,33,55,11};
        for (int x=0; x < data.length-1; x++) {  //对于 n 个数的数组,需要比较 n-1 轮
            for (int j = 0; j < data.length-1-x; j++) {
                if (data[j] > data[j+1]) {
                    int t = data[j];
                    data[j] = data[j+1];
                    data[j+1] = t;
                }
            }
        }
        //打印结果
        for (int a : data) {    System.out.print(a+"\t");   }
    }
}
输出结果:11 33 44 55 66 77 

2、选择排序

选择由小到大排序思路:从当前的数中选择最小的交换到前面。

package cn.lwj0126.javase.array.test;
//选择排序:找出每轮最小的交换到前面
public class SelectionSorting {
    public static void main(String[] args) {
        int[] data = {77,44,66,33,55,11};
        selectionSort(data);
        for (int a : data ) {    System.out.print(a+"\t");   }
    }
    public static void selectionSort(int[] data){
        for (int i = 0; i < data.length-1; i++) {//有n个数的数组,进行n-1轮选择
            int index = i;  //最小元素的下标
            for (int j = i; j < data.length-1; j++) {
                if (data[j] > data[j+1]){
                    index = j+1;
                }
            }
            swap(data , i , index);
        }
    }
    public static void swap(int[] data , int i , int index){
        int temp = data[i];
        data[i] = data[index];
        data[index] = temp;
    }
}
执行结果:11  33  44  55  66  77  

3、二分查找

二分查找的前提是数组已经由小到大排序。二分查找思路是始终与中间的元素比较大小,如果要查找的元素小于中间数,查找范围缩小到左一半;如果要查找的元素比中间的元素大,把查找范围缩小到右一半。

不会写?java.util.Arrays 类已提供了 binarySearch(int[] a, int key) 方法,在 a数组中采用二分查找,返回 key元素的索引值。

package cn.lwj0126.javase.array.test;
import java.util.Arrays;
public class BinarySeaching {
    public static void main(String[] args) {
        int[] data = {11,77,33,44,22,66};
        Arrays.sort(data);  //数组排序,升序
        System.out.println("排序后:" + Arrays.toString(data));
        int a = binarySeach(data,33);  //比如查找33
        if (a == -1)
            System.out.println("没找到");
        else
            System.out.println("索引位置:" + a);
    }
    public static int binarySeach(int[] data , int key){
        int from = 0;
        int end = data.length-1;
        while(from <= end){
            int mid = (from + end) / 2;
            if (key == data[mid])       //正好中间
                return mid;
            else if(key < data[mid])    //中间偏左
                end = mid - 1;
            else                        //中间偏右
                from = mid + 1;
        }
        return -1;
    }
}
执行结果:
    排序后:[11, 22, 33, 44, 66, 77]
    索引位置:2

 

posted @ 2022-03-31 21:11  鹿先森JIAN  阅读(32)  评论(0编辑  收藏  举报