Java数组的排序方式

2016-12-17  本文已影响119人  字节码

1.选择排序
将第0个位置元素与每一个元素进行比较,如果比第0个元素大,就交换位置

/**
 * 直接排序(选择排序)
 * 将一个数组中的元素,按照从大到小排序 
 */

import java.nio.charset.MalformedInputException;

public class Test1 {

    public static void main(String[] args) {
        
        int[] arr = new int[6];
        arr[0] = 1;
        arr[1] = 10;
        arr[2] = 29;
        arr[3] = 3;
        arr[4] = 399;
        arr[5] = 31;
        
        selectionShort(arr);
        
        for (int i = 0; i<arr.length; i++) {
                
            System.out.println(arr[i] + ",");
        }
        
    }
    
    /// 选择排序方法
    public static void selectionShort(int[] arr) {
        
        /*
         * 选择排序
         */
        
        for (int j = 0; j<arr.length - 1; j++) {
            
            for (int i = j; i < arr.length; i++) {
                if (arr[i] > arr[j]) {
                    /// 交换位置
                    int temp = arr[j];
                    arr[j] = arr[i];
                    arr[i] = temp;
                }
            }
        }
    }

2.冒泡排序

/*
 * 数组的冒泡排序: 
 * 如果要按照升序排序,将数组中相邻的两个元素进行比较,交换相邻数组的位置
 */

public class BubbleSort {

    public static void main(String[] args) {
        
        int[] arr = {1, 20, 30, 50, 3, 45};
        
        bubbleSort(arr);
        
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i] + ",");
        }
        
    }
    
    public static void bubbleSort(int[] arr) {
        

        for (int j = 0; j < arr.length - 1; j++) {  /// 控制遍历的次数
            for (int i = 0; i < arr.length-1; i++) {  /// 找出相邻最新元素,交换位置
                if (arr[i] > arr[i + 1]) {
                    
                    int temp = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = temp;
                }
            }
        }
        
}

3.二分查找法:
前提:二分查找的前提是需要查找的数组必须是已排序的,我们这里的实现默认为升序

需求: 给定一个值,从数组中查找这个值所对应的索引
思路:
先定义3个变量分别记录数组最大的索引、最小的索引、中间的索引,
然后每次遍历数组时,用要查询值与中间索引对应的元素比较,
当要查询的值小于中间索引对应的元素时,缩小查找范围,让最大的索引等于中间的索引-1;
当要查询的值大于中间索引对应的元素时,缩小查找范围,让最小的索引等于中间的索引+1;
当要最大的索引小于最小的索引时,说明找不到要查询的值;
当要查询的值等于中间索引对应的元素时,即找到了,返回中间的索引即可;

/*
 * 需求: 给定一个值,查找数组中这个值对应的索引
 */
public class DichotomySearch {

    public static void main(String[] args) {
        
        int[] arr = {10, 20, 30, 40, 50};
        int target = dichotomySearch(arr, 40);
        System.out.println(target);
    }
    
    public static int dichotomySearch(int[] arr, int target) {
        
        // 1.定义3个变量,分别记录要查询的数组的最大索引、最小索引、中间索引
        int max = arr.length - 1;
        int min = 0;
        int mid = (max + min) / 2;
        
        // 2.遍历数组
        while (true) {
            
            if (target > arr[mid]) {
                
                min = mid + 1;
            } else if (target < arr[mid]) {
                max = mid - 1;
            } else if (target == arr[mid]) {
                
                return mid;
            }
            
            if (max < min) {
                return -1;
            }
            
            // 重新计算mid
            mid = (max + min) / 2;
            
        }
    }
}

4.给定一个char类型的数组,将这个数组中的所有元素反转排序,比如原来是{'a', 'c', 'b'}; 要求结果是{'b', 'c', 'a'};
思路: 变量这个数组中的每一个元素,交换相邻两个数组元素的位置,
注意:已经交换过的就不要在交换了

/*
 * 给定一个char类型的数组,反转数组中的每一个元素
 */

public class Demo1 {

    public static void main(String[] args) {
        
        char[] arr = {'a', 'b', 'c', 'd', 'e', 'f'};
        
        invertedOrder(arr);
        
        for (int j = 0; j < arr.length; j++) {
            
            System.out.print(arr[j] + ",");
        }
        
    }
    
    public static void invertedOrder(char[] arr) {
        
        for (int j = 0; j < arr.length - 1; j++) {
            for (int i = 0; i < arr.length - j - 1; i++) { // 减1是为了防止数组越界,减j是为了让已经排序过的就不再排序了
                // 交换相邻两个数组元素的位置
                char temp = arr[i];
                arr[i] = arr[i+1];
                arr[i+1] = temp;
            }
        }
        
    
    
}

5.Arrays的简单使用

数组的工具类为Arrays
使用前需要导包import java.util.*;
将数组类型转换为字符串的函数toString();
对数组排序的方法Arrays.sort(arr);
查找某个元素在数组中的位置(二分查找发) Arrays.binarySearch(arr, 33); 返回元素所在的索引值,如果找不到元素会返回负数

public class Demo {

    public static void main(String[] args) {
        
        /// 通过sun提供的接口对数组进行排序
        int[] arr = {10, 20, 30, 33, 22, 11};
        
        Arrays.sort(arr); /// sort内部使用的是选择排序
        
        /// 通过sun提供的接口查找数组中的某个元素
        int index = Arrays.binarySearch(arr, 33); /// binarySearch内部使用的是二分查找法
        
        /// 将数组转换为字符串
        String info = Arrays.toString(arr);
        
        System.out.println("数组中的元素:" + info + "查找元素所在的索引:" + index);
    }
}

6.二维数组的简单使用

二维数组可以看成以数组为元素的数组;
Java中二维数组的声明和初始化应按照从高维到低维的顺序进行.

public static void main(String[] args) {
    
        /// 动态初始化二维数组
        int[][] arr = new int[2][];
        arr[0] = new int[3];
        arr[1] = new int[4];
        arr[0][0] = 10;
        arr[0][1] = 20;
        arr[0][2] = 22;
        arr[1][0] = 54;
        arr[1][1] = 98;
        arr[1][2] = 22;
        arr[1][3] = 13;
        
        /// 遍历数组中每一个元素
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                System.out.println(arr[i][j] + ",");
            }
            System.out.println();
        }
        
        /// 静态二维数组
        int[][] arr1 = {{10, 20, 11, 33}, {8, 11, 22, 19, 111}};
        
        for (int i = 0; i < arr1.length; i++) {
            for (int j = 0; j < arr1[i].length; j++) {
                System.out.println(arr1[i][j] + ",");
            }
            System.out.println();
        }
        
        
    }

总结:Java数组的特点

1. 数组只能存储同一种 数据类型的数据。
2. 数组是会给存储到数组中 的元素分配一个索引值的,索引值从0开始,最大的索引值是length-1;
3. 数组一旦初始化,长度固定。
4. 数组中的元素与元素之间的内存地址是连续的。
上一篇下一篇

猜你喜欢

热点阅读