序言
数组有有序数组和无序数组,有些情况下我们要把无序数组先变成有序数组才能进行后续的操作,例如我上一篇文章中提到的二分查找,这个时候就需要对数组进行排序了,如何对数组排序?下面给大家介绍几种排序方法。
一、冒泡排序
- 冒泡排序是指两两比较待排序的数组元素,如果不满足要求,就交换这两元素,直到全部数组元素满足顺序要求即可。
- 对长度为n的数组进行冒泡排序的步骤如下:
1、第一轮排序:将第一个元素和第二个元素进行比较,若大于第二个元素则将两个元素交换,然后比较第二个和第三个元素,以此类推直到第n-1个和第n个元素进行了比较交换。经过第一轮排序后,最大的元素被交换到末尾位置即第n个位置。
2、对前n-1个元素进行第二轮冒泡排序,将其中队打得元素交换到第n-1个位置去。
3、以此类推,直到排序时数组的元素顺序未发生任何变化即可,冒泡排序完成。 - 时间复杂度:最坏情况O( n^2 ),最好情况O( n ),平均时间复杂度O(n^2),
- 冒泡排序流程图如下(该图片来源于百度图片)
- 冒泡排序相关代码
for(int i=0;i<arr.length-1;i++){
for(int j=0;j<arr.length-1-i;j++){
if(arr[j]>arr[j+1]){
int t = arr[j];
arr[j] = arr[j+1];
arr[j+1] = t;
}
}
}
二、直接选择排序
- 直接选择排序:找到待排序元素中最小的元素,顺序排在已排序元素的最后面,以此类推一直到全部元素都排完即完成排序。
- 时间复杂度:最坏情况,最好情况和平均时间复杂度都为O(n^2)。
- 直接选择排序流程图如下(该图片来源于百度图片)
- 直接选择排序相关代码
for(int i=0;i<arr.length-1;i++){
int t=i; //最小值元素下标t初始值设为i
for(int j=i+1;j<arr.length;j++){
if(arr[j]<arr[t]){
t=j;
}
}
//将这一轮找到的最小元素与a[i]交换
int m = arr[i];
arr[i] = arr[t];
arr[t] = m;
}
三、直接插入排序
- 直接插入排序是指将待排序元素按照大小插入到已排序元素中的适当位置,以此类推直到待排序元素插入完即完成排序
- 时间复杂度:最坏情况O( n^2 ),最好情况O( n ),平均时间复杂度O( n^2 )
- 直接插入排序流程图如下(该图片来源于百度图片)
- 直接插入排序相关代码
for(int i=1;i<arr.length;i++){
for(int j=i;j>0;j--){
if(arr[j-1]>arr[j]){
int t = arr[j-1];
arr[j-1] = arr[j];
arr[j] = t;
}
}
}
t
四、sort()方法
- Arrays类的sort()方法可对任意类型数组进行升序排序。
import java.util.Arrays; //导入java.util.Arrays类
...
Arrays.sort(arr); //直接调用sort()方法排序即可
小结
- 以上几种排序方法是几种比较简单的排序,也是我接触过的几个,并不是全部,排序方法还有很多,例如归并排序、快速排序等。
- 前三种排序方式大同小异,都是先比较元素然后根据要求进行交换,而sort()方法是java中最简单最常见的排序方法,个人更喜欢用这种方法。
- 用sort()方法应注意对string类型数组排序时,数字排在字母前,大写字母排在小写字母前面。