Java程序员编程中经常使用到Java数组排序,下面详解四种常用的Java数组排序方法@mikechen
冒泡排序法
冒泡排序的英文Bubble Sort,是一种最基础的交换排序。之所以叫做冒泡排序,因为每一个元素都可以像小气泡一样,根据自身大小一点一点向数组的一侧移动。
下面通过一个动图来看一看冒泡排序到底是怎么样移动的,如下图所示:
代码示例如下:
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
选择排序
选择排序也是一种简单直观的排序算法,实现原理比较直观易懂。
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
下面通过一个动图来看一看选择排序到底是怎么样移动的,如下图所示:
代码如下:
//选择排序 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 的有序表。
下面通过一个动图来看一看插入排序到底是怎么样移动的,如下图所示:
代码如下:
//插入排序 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.再对左右区间重复第二步,直到各区间只有一个数。
下面通过一个动图来看一看快速排序到底是怎么样移动的,如下图所示:
代码示例如下:
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年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》