Java数组的排序方式

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. 数组中的元素与元素之间的内存地址是连续的。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容