Java数组的排序方法详解(4种常用排序代码)

Java数组的排序方法详解(4种常用排序代码)-mikechen

Java程序员编程中经常使用到Java数组排序,下面详解四种常用的Java数组排序方法@mikechen

冒泡排序法

冒泡排序的英文Bubble Sort,是一种最基础的交换排序。之所以叫做冒泡排序,因为每一个元素都可以像小气泡一样,根据自身大小一点一点向数组的一侧移动。

下面通过一个动图来看一看冒泡排序到底是怎么样移动的,如下图所示:

Java数组的排序方法详解(4种常用排序代码)-mikechen

代码示例如下:

public static void main(String[] args) {
        int num[]= {5,68,1,8};
        System.out.println("数组排序前的顺序:");
        for(int i=0;i<num.length;i++) {
            System.out.println(num[i]+"");
        }int temp;
        for(int i=0;i<num.length-1;i++) {//总共需要比较3轮
            for(int j=0;j<num.length-i-1;j++) {//每轮比较
                if(num[j]>num[j+1]) {
                    temp=num[j];
                    num[j]=num[j+1];
                    num[j+1]=temp;
                     
                    }
                }
            }System.out.println("排序后的顺序是:");
            for(int i1=0;i1<num.length;i1++) {
                System.out.println(num[i1]+" ");
        }
     
    }

数组排序前的顺序:

5
68
1
8

数组排序后的顺序:

1
5
8
68

 

选择排序

选择排序也是一种简单直观的排序算法,实现原理比较直观易懂。

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

下面通过一个动图来看一看选择排序到底是怎么样移动的,如下图所示:

Java数组的排序方法详解(4种常用排序代码)-mikechen

代码如下:

//选择排序
    public static void selectionSort(int[] arr){

        //定义一个数,用于记录找到的数
        int temp = 0;
        //第一层for循环为执行的总次数,因为执行到倒数第二个数是,数组已经有序,故arr.length -1
        for(int i = 0; i < arr.length -1; i++){
            //用于记录下标
            int index = i;
            //这里是从i开始后的所有数都要进行比较
            for (int j = i + 1;j < arr.length; j++){
                //如果发现有比arr[i]大的,则更新下标,这样是为了最终找到最小的那个数的下标
                if (arr[index] > arr[j]){
                    index = j;
                }
            }
            //如果进入循环前的i发生了变化,则证明有数更小,并且更小的数,下标为j,直接交换即可
            if (index != i){
                temp = arr[index];
                arr[index] = arr[i];
                arr[i] = temp;
            }
        }
    }

 

插入排序

插入排序(InsertionSort),一般也被称为直接插入排序,适合于少量元素的排序。

插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增 1 的有序表。

下面通过一个动图来看一看插入排序到底是怎么样移动的,如下图所示:

Java数组的排序方法详解(4种常用排序代码)-mikechen

代码如下:

//插入排序
public static void insertSort(int[] arr){
//用于记录数据以及下标
int temp = 0 , j = 0;
//从第二个数(即 i = 1)开始进行对前面进行插入
    for(int i = 1; i < arr.length; i++){
    //记录这个数以及下标
    temp = arr[i];
    j = i;

    //记录下的temp比它前面的数(j - 1)要小,则往前插入,当j = 0时为最前面的数了,所以结束
    while (j > 0 && temp <arr[j - 1]){
    //直接让在自己前面的数将自己覆盖(可以看成是前面的数往后退了),因为已经用temp记录下来了
        arr[j] = arr[j-1];
        //然后继续往前找
        j--;
    }
    //循环结束后,则说明已经找到了位置,而且下标为j,直接插入即可
        arr[j] = temp;
    }
}

 

快速排序

Java快速排序在几种排序方法中是效率较高的,快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序,它采用了一种分治的策略,通常称其为分治法。

快速排序的基本思想:

1.先从要排序的数列中找定义一个基准数;

2.将比基准数大的放在基准数的右边,比基准数小的放在基准数的左边;

3.再对左右区间重复第二步,直到各区间只有一个数。

下面通过一个动图来看一看快速排序到底是怎么样移动的,如下图所示:

Java数组的排序方法详解(4种常用排序代码)-mikechen

代码示例如下:

 1//Java 代码实现
 2public class QuickSort implements IArraySort {
 3
 4    @Override
 5    public int[] sort(int[] sourceArray) throws Exception {
 6        // 对 arr 进行拷贝,不改变参数内容
 7        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
 8
 9        return quickSort(arr, 0, arr.length - 1);
10    }
11
12    private int[] quickSort(int[] arr, int left, int right) {
13        if (left < right) {
14            int partitionIndex = partition(arr, left, right);
15            quickSort(arr, left, partitionIndex - 1);
16            quickSort(arr, partitionIndex + 1, right);
17        }
18        return arr;
19    }
20
21    private int partition(int[] arr, int left, int right) {
22        // 设定基准值(pivot)
23        int pivot = left;
24        int index = pivot + 1;
25        for (int i = index; i <= right; i++) {
26            if (arr[i] < arr[pivot]) {
27                swap(arr, i, index);
28                index++;
29            }
30        }
31        swap(arr, pivot, index - 1);
32        return index - 1;
33    }
34
35    private void swap(int[] arr, int i, int j) {
36        int temp = arr[i];
37        arr[i] = arr[j];
38        arr[j] = temp;
39    }
40
41}

 

Java数组排序总结

以上主要就详解了Java数组排序的四种方法:快速排序法、冒泡法、选择排序法、插入排序法,希望对你有所帮助!

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法