天天看點

數組經典的算法。(冒泡排序,選擇排序,二分法查找)

1.冒泡排序:

思路分析:

  • 數組中 第一個空間值和第二個空間值比較,把較大的值存在第二個空間中。第二個空間值和第三個空間值比較,把較大的值存在第三個空間中。依次類推,把最大值存放在最後一個空間中。
  • 因為已經找到最大的值了,是以再一次循環就要找到倒數第二大的值存放在倒數第二個空間。

代碼示範:

import java.util.Arrays;

public class MaoPao {
    public static void main(String[] args) {
        int[] arr={2,6,85,95,3,2,54,1};
       bubbleSort(arr);
    }
    public static void bubbleSort(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]){
                    int temp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}      

2.選擇排序

思路分析:

算法原則(從小到大):先用數組第一個空間值和數組其他空間值依次作比較,如果找到比第一個空間值小的就把第一個值和目前值進行調換。依次比較完所有的内容,第一個空間值存放的一定是最小值。第一值比較完,在進行類推。比較完數組的所有位置。

使用空間找空間中需要的元素,外循環推進的是位置,内循環是目前位置之後的每一位。

代碼示範:

import java.util.Arrays;

public class XuanZe {
    public static void main(String[] args) {
        int[] arr={2,96,3,56,8,7,9};
        selectSort(arr);
    }

    public static void selectSort(int[] arr){
        // 提供比較空間的角标
        for(int i=0;i<arr.length-1;i++){
            // 提供剩餘空間的角标
            for(int j=i+1;j<arr.length;j++){
                // i對應的值不是最小的
                if(arr[i]>arr[j]){
                    int temp=arr[i];
                    arr[i]=arr[j];
                    arr[j]=temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}      

3.一般查找

思路分析:

代碼示範:

public class Chazhao {
    public static void main(String[] args) {
        int[] arr={2,85,65,74,96,32,33};
        System.out.println(searchKey(arr,32));
    }
    public static int searchKey(int[] arr,int value){
        // 周遊查找
        for (int i = 0; i < arr.length; i++){
            if (value == arr[i]) return i;// 找到目标元素
        }
        return -1;// 完全周遊後,仍然沒結果。
    }
}      

4.二分查找

思路分析:

  1. 找到中間角标對應的值。
  2. 讓該元素和要找的值進行比較。
  3. 如果要找的數字大了,縮小範圍。要找的範圍是:中間角标+1 到 尾角标。反之,在頭角标 到 中間角标-1
  4. 不斷重複,直到找到目标。

代碼示範:

public class Demo05 {
    public static int binarySearch(int []arr,int value){

        // 定義變量存放最大角标 最小角标 中位角标
        int max,min,mid;
        min = 0;
        max = arr.length-1;
        mid = (min+max)>>1;
        while (arr[mid]!=value){
            if (value>arr[mid]){// 在右側區域
                min = mid + 1;
            }
            else if(value<arr[mid]){// 在左側區域
                max = mid - 1;
            }
            if(max<min){// 周遊結束
                return -1;
            }
            mid = (min+max)>>1;// 再次二分
        }
        return mid;// 目标角标
    }
}