数组排序,Arrays数组工具类专题(Arrays工具类)

数组排序,Arrays数组工具类专题(Arrays工具类)

1. 冒泡排序

2. 选择排序

3. 二分查找法

最后是Arrays工具类的三个方法:

  1. Arrays.toString()方法,将数组转换成字符串
  2. Arrays.sort()方法,将字符串进行排序
  3. Arrays.binarySearch()方法,通过值查找对应索引.注意(排序问题!).
package com.heima.array;

/*
 * A:画图演示
        需求:
            数组元素:{24, 69, 80, 57, 13}
            请对数组元素进行排序。
            冒泡排序
            相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处
 * B:案例演示
            数组高级冒泡排序代码
---------------------------------------------
 * A:画图演示
    * 需求:
        * 数组元素:{24, 69, 80, 57, 13}
        * 请对数组元素进行排序。
        * 选择排序
            * 从0索引开始,依次和后面元素比较,小的往前放,第一次完毕,最小值出现在了最小索引处
  * B:案例演示
        * 数组高级选择排序代码
 */

public class Demo1_Array {
    public static void main(String[] args) {
         int[] arr = {24, 69, 80, 57, 13};
         bubbleSort(arr);
//       selectSort(arr);
         print(arr);
    }
    /*
     * 冒泡排序 1,返回值类型,void 2,参数列表,int[] arr
     * 
     * 第一次:arr[0]与arr[1],arr[1]与arr[2],arr[2]与arr[3],arr[3]与arr[4]比较4次
     * 第二次:arr[0]与arr[1],arr[1]与arr[2],arr[2]与arr[3]比较3次
     * 第三次:arr[0]与arr[1],arr[1]与arr[2]比较2次 
     * 第四次:arr[0]与arr[1]比较1次
     */
    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;*/
                    swap(arr,j,j+1);

                }
            }
        }
    }

    public static void print(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }

    /*
     * 选择排序
     * 1,返回值类型void
     * 2,参数列表int[] arr
     * 
     * 第一次:arr[0]分别与arr[1-4]比较,比较4次
        第二次:arr[1]分别与arr[2-4]比较,比较3次
        第三次:arr[2]分别与arr[3-4]比较,比较2次
        第四次:arr[3]与arr[4]比较,比较1次
     */

    public static void selectSort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[i] > arr[j]) {
                    /*int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;*/
                    swap(arr,i,j);
                }
            }
        }
    }

    /*
     *换位操作
     *1,返回值哦类型,void
     *2,参数列表int[] arr , int i , int j
     *
     *如果某个方法,只针对本类使用,不想让其他类使用就可以定义成私有的
     */
    public static void swap(int[] arr, int i ,int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}
package com.heima.array;

/*
 *A:案例演示
    * 数组高级二分查找代码
* B:注意事项
    * 如果数组无序,就不能使用二分查找。
        * 因为如果你排序了,但是你排序的时候已经改变了我最原始的元素索引。
 */
public class Demo2_Array {

    public static void main(String[] args) {
        int[] arr = { 11, 22, 33, 44, 55, 66, 77 };
        System.out.println(getIndex(arr, 22)); // 1 //返回的是对应的索引值
        System.out.println(getIndex(arr, 66)); // 5

        System.out.println(getIndex(arr, 88)); // -1 在源代码中返回的值是 -插入值 - 1;
        System.out.println(getIndex(arr, 10)); // -1
        System.out.println(getIndex(arr, 20)); // -1

    }

    // 二分查找法,获得索引值
    // 1,返回值类型,int
    // 2,参数列表,int[] arr , int value

    public static int getIndex(int[] arr, int value) {
        int min = 0;
        int max = arr.length - 1;
        int mid = (min + max) >> 1;

        while (arr[mid] != value) {
            if (arr[mid] > value) {
                max = mid - 1;
            } else if (arr[mid] < value) {
                min = mid + 1;
            }
            mid = (min + max) >> 1;

            if (min > max) {
                return -1;
            }
        }
        return mid;
    }
}
package com.heima.array;

import java.util.Arrays;

/*
 * * A:Arrays类概述
    * 针对数组进行操作的工具类。
    * 提供了排序,查找等功能。
* B:成员方法          
    * 
    * public static String toString(int[] a)         //使用toString方法,将数组转换成字符串
    * public static void sort(int[] a)                 //使用sort方法,将数组进行排序
    * public static int binarySearch(int[] a,int key)//使用binarySearch方法查找值的索引!
 */
public class Demo3_Array {
    public static void main(String[] args) {

        int[] arr = { 33, 22, 11, 12, 44, 55, 66 };
        System.out.println(Arrays.toString(arr)); // [33, 22, 11, 12, 44, 55,
                                                    // 66]

        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr)); // [11, 12, 22, 33, 44, 55,
                                                    // 66]

        // 使用二分法的前提数组必须是有序的!!!如果排序后才使用,那索引值是排序后的数组索引!!!
        int[] arr2 = { 11, 22, 33, 44, 55, 66, 77 };
        System.out.println(Arrays.binarySearch(arr2, 22)); // 1
        System.out.println(Arrays.binarySearch(arr2, 66)); // 5
        // 当值不包含数组中,返回(-插入点-1).
        System.out.println(Arrays.binarySearch(arr2, 10)); // -1 因为10应该放在数组0索引
                                                            // -0-1 为-1
        System.out.println(Arrays.binarySearch(arr2, 100)); // -8
                                                            // 因为100应该放在数组7索引位置
                                                            // -7-1 -8

    }

    // Arrays工具类中的toString源码
    public static String toString(int[] a) {
        if (a == null) // 如果传入的数组是null
            return "null"; // 返回null
        int iMax = a.length - 1; // iMax是最大索引
        if (iMax == -1) // 如果数组中没有元素,则上一行为(0-1)=-1.
            return "[]"; // 返回[] 代表数组元素为空

        StringBuilder b = new StringBuilder(); // 为什么选StringBuilder?线程不安全,但效率高
        b.append('['); // 将[添加到字符串缓冲区中
        for (int i = 0;; i++) { // 遍历数组,判断语句没写默认是true
            b.append(a[i]); // 把第一个元素添加进字符串缓冲区
            if (i == iMax) // 如果索引等于最大索引
                return b.append(']').toString(); // 将]添加子字符串缓冲区,在转换成字符串并返回
            b.append(", "); // 如果不等于最大索引就继续将,添加到缓冲区
        }
    }

    // Arrays工具类中的binarySearch0源码
    private static int binarySearch0(int[] a, int fromIndex, int toIndex, int key) {
        int low = fromIndex; // 0,最小索引
        int high = toIndex - 1; // a.length - 1;最大索引

        while (low <= high) { // 最小索引小鱼等于最大索引可以循环判断
            int mid = (low + high) >>> 1; // 向右移1位,相当于除以2,求出中间索引值,(最小+最大)/2
            int midVal = a[mid]; // 通过中间索引获取中间值

            if (midVal < key) // 中间索引对应的值小于查找的值
                low = mid + 1; // 最小索引变化
            else if (midVal > key) // 中间索引对应的值大于查找的值
                high = mid - 1; // 最大索引变化
            else
                return mid; // key found //找到了
        }
        return -(low + 1); // key not found. //没找到,返回 -插入点-1
    }

}

你可能感兴趣的:(JavaSE)