常见的数组排序方法有许多,在这里只介绍常见的、以及面试常遇见的集中排序方法:选择排序法、冒泡排序法以及插入排序法。
通过下面的这个例子来进行详细说明:
例子:定义一个一维数组,存入一组数据;对里面的数据进行排序:
int[] arr ={34,19,11,109,3,45};
对上面的一维数组进行从小到大的排序操作:
方法一:选择排序法;
原理:从最小的角标开始,对该角标之后的数据遍历对比,将最值存入首角标,并依次类推,得到有序数组;
具体的实现方法如下图所示:
具体实现代码:
package cn.itcast.p1.string.demo;
class Sort{
public static void main(String[] args){
int[] arr ={34,19,11,109,3,45};
for(int ar : arr){
System.out.print(ar+" ");
}
System.out.println();
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;
}
}
}
for(int ar : arr){
System.out.print(ar+" ");
}
}
}
上面的程序中,有两个for循环进行嵌套。外面的for循环控制进行比较的基值arr[i](每次这个基值
对与基值后的数据进行对比)。内部for循环控制基值对比值的循环arr[j]。每一次循环,都会得到
这一组数据中的最小值,并将其存入基值的地址中。对于基值,每一次循环后,角标加一。所以,
内部中的开始比较的角标为i+1;
方法二:冒泡排序;
原理:从前往后,取最大值存入最大地址。
实现过程如下图所示:
代码实现如下:
package cn.itcast.p1.string.demo;
public class PuppleSort {
/**
* 冒泡排序;
*/
public static void main(String[] args) {
int[] arr={34,19,11,109,3,45};
for(int ar : arr){
System.out.print(ar+" ");
}
System.out.println();
for(int i=0;i<arr.length-1;i++){//外循环,用于控制循环的次数;
for(int j=0;j<arr.length-1-i;j++){//内循环,每次从0角标开始直到最后,找出最大值存入最后一位。为了提高效率,
//每次循环后,循环次数减一(省去之前最大值存入位的比较),所以使用j<arr.length-1-i;
if(arr[j]>arr[j+1]){
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
for(int ar : arr){
System.out.print(ar+" ");
}
}
}
方法三:插入排序;
原理:就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。
实现过程如下图:
代码实现如下:
package cn.itcast.p1.string.demo;
import java.util.Arrays;
public class CharuSort {
public static void main(String[] args){
int[] arr={34,19,11,109,3,45};
for(int ar : arr){
System.out.print(ar+" ");
}
System.out.println();
for(int i=1;i<arr.length;i++){//外循环,提供用于排序的数组角标长度,同时也控制循环次数。
for(int j=i;j>0;j--){//内循环,每次取出角标为j的数据在0~j角标内进行排序。确保每次排序后0~j角标内的数据是有序的。
if(arr[j]<arr[j-1]){
int temp=arr[j];
arr[j]=arr[j-1];
arr[j-1]=temp;
}
}
}
for(int ar : arr){
System.out.print(ar+" ");
}
}
}
以上是对三种排序方法的详细介绍;但是在开发中Java使用自己封装好的一个函数实现:
Arrays.sort(arr);
介绍以上三种方法,可以对排序方法有更好的认识。