冒泡排序、选择排序、插入排序和二分法查找

时间:2019-02-18
本文章向大家介绍冒泡排序、选择排序、插入排序和二分法查找,主要包括冒泡排序、选择排序、插入排序和二分法查找使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
public class HelloJava {
    public static void main(String[] args){
        HelloJava helloJava = new HelloJava();
        //helloJava.maoPao();
        //helloJava.xuanZe();
        //helloJava.chaRu();

        //二分法必须保证数列是有序的
        int[] num = {2,9,9,33,43,55,67,90};
        int i = helloJava.erFen(num, 55);
        System.out.print(i);
    }

    //冒泡排序。冒泡排序是一种稳定的排序(相同元素之间两个位置并没有改变)
    public void maoPao(){
        int [] num = {55,33,67,2,9,90,9,43};
        for (int i=0;i<num.length;i++){
            for (int j = 0;j<num.length-i-1;j++){
                //从小到大排序
                if(num[j]>num[j+1]){
                    num[j] = num[j]+num[j+1];
                    num[j+1] = num[j]-num[j+1];
                    num[j] = num[j]-num[j+1];
                }
            }
        }
        for (int n:num){
            System.out.println(n);
        }
    }

    //选择排序。选择排序是一种不稳定的排序(相同元素之间两个位置可能会改变),但是速度快。
    public void xuanZe(){
        int [] num = {55,33,67,2,9,90,9,43};
        //用于记录每次比较后最小值的下标
        int minIndex = 0;
        //控制轮数
        for (int i=0;i<num.length;i++){
            //假设每轮最小值下标为i
            minIndex = i;
            for (int j=i+1;j<num.length;j++){
                if (num[minIndex]>num[j]){
                    minIndex=j;
                }
            }
            //判断需要交换的数下标是否为自己
            if (minIndex!=i){
                num[minIndex] = num[minIndex]+num[i];
                num[i] = num[minIndex]-num[i];
                num[minIndex] = num[minIndex]-num[i];
            }
        }
        for (int n:num){
            System.out.println(n);
        }
    }

    //插入排序.
    public void chaRu(){
        int [] num = {55,33,67,2,9,90,9,43};
        //控制比较的次数
        for (int i = 1;i<num.length;i++){
            //记录操作数
            int temp = num[i];
            int j=0;
            //循环
            for (j=i-1;j>=0;j--){
                if (num[j]>temp){
                    num[j+1] = num[j];
                }else {
                    break;
                }
            }
            if (num[j+1]!=temp){
                num[j+1] = temp;
            }
        }
        for (int n :num){
            System.out.println(n);
        }
    }

    //二分查找。效率极高,常用!(但首先应该是已经排好序的)
    public int erFen(int[] num,int key){
        //开始下标
        int start = 0;
        //结束下标
        int end = num.length-1;
        while (start<=end){
            int middle = (start+end)/2;
            if (num[middle]>key){
                end = middle-1;
            }else if(num[middle]<key){
                start = middle+1;
            }else {
                return middle;
            }
        }
        return -1;

    }