|
在Java的时候,对于排序的应用需要熟练的掌握,这样才能够确保Java学习时候能够有扎实的基础能力。那Java有哪些排序算法呢?下面,先来详细说说Java经典的8种排序算法。
经典的排序算法有八种,分别为:
- 冒泡排序
- 选择排序
- 插入排序
- 归并排序
- 希尔排序
- 快速排序
- 堆排序
- 基数排序
其中冒泡排序、选择排序、插入排序称为三大基本排序。
虽然这三大基本排序算法时间复杂度都是O(n2),但是其实细细讨论之下,还是有各自的特点的。
一、冒泡排序(重点)
升序排列的实现思想:
1.将数组中相邻的两个数据元素进行比较,如果前面一个元素比后面的大,就把两者交换位置(一轮比较);
2.然后将上面的操作进行循环(比较n-1轮)。
排列过程如下图所示:
降序排列的实现思想:
1.将数组中相邻的两个数据元素进行比较,如果前面一个元素比后面的小,就把两者交换位置(一轮比较);
2.然后将上面的操作进行循环(比较n-1轮)。
基本实现
大家要注意,面试时经常会让我们手写冒泡排序和选择排序等算法,你必须牢牢地记住相关的代码实现哦。
public class Demo09 {
public static void main(String[] args) {
// 冒泡排序--基本实现
//待排序的数组
int[] arr = { 1, 3, 46, 22, 11 };
//控制需要比较几轮
for (int i = 0; i < arr.length; i++) {
//控制每一轮的比较次数
for (int j = 0; j < arr.length - 1; j++) {
//如果前面的比后面的数字大,则两者就进行交换
if (arr[j] > arr[j + 1]) {
//两数交换,需要一个“第三方”,好比两杯水互换,需要第三个杯子。
//交换两个变量的值,必须借助一个临时变量。
//定义一个新的临时变量,将数组中的前面的元素先赋值给临时变量
int temp = arr[j];
//后面的值赋值到前面的位置上
arr[j] = arr[j + 1];
//再将临时变量的值赋值到后面的位置上
arr[j + 1] = temp;
}
}
}
//遍历排序后的数组
for(int i=0;i<arr.length;i++) {
System.out.print(arr+&#34;\t&#34;);
}
}
}这种实现方式比较容易理解,但并不是最优的实现方案,因为这种方案需要比较的次数较多。我们可以进一步对该方案进行优化,将比较的次数降下来,请继续往下看。
二、选择排序
选择排序升序思路:
1.将当前位置上的数,与它后面的每个数进行比较,选择出最小的那个数,交换到当前位置;
2.循环选择当前位置上的数。
选择排序降序思路:
1.将当前位置上的数,与它后面的每个数进行比较,选择出最大的那个数,交换到当前位置;
2.循环选择当前位置上的数。
2.1 实现案例
以下是以升序的方式实现的选择排序代码,供大家参考。
public class Demo12 {
public static void main(String[] args) {
// 选择排序
// 待排序的数组
int[] arr = { 1, 3, 46, 22, 11 };
for (int j = 0; j < arr.length-1; j++) {
//选择下标为0的位置
int min = j;
//将当前这个数与后面的每个数进行比较
for (int i = j+1; i < arr.length; i++) {
//如果当前数字小于标记的最小值,则将当前数字标记为最小值
if(arr[min] > arr) {
min = i;
}
}
//如果当前数字不是最小的,则进行交换
if(min != j) {
int temp = arr[j];
arr[j] = arr[min];
arr[min] = temp;
}
}
//遍历排序后的数组
for(int i=0;i<arr.length;i++) {
System.out.print(arr+&#34;\t&#34;);
}
}
}三、Arrays.sort方法
Arrays工具类主要用于对数组进行排序、查找、填充、比较等的操作,该类存在于java.util包下,所以我们使用的第一步就是要先进行导包: import java.util.Arrays;
其中Arrays.sort()是Arrays类中的一个静态方法,用于对数组进行排序,我们可以直接调用。该方法有如下几种重载形式:
sort(T[] a):对指定T型数组按数字升序排序;
sort(T[] a, int formIndex, int toIndex):对指定T型数组中[formIndex,toIndex)数据按数字升序排序;
sort(T[] a, Comparator<? supre T> c): 依据比较器对T型数组进行排序;
sort(T[] a, int formIndex, int toIndex, Comparator<? supre T> c): 依据比较器产生的顺序对T型数组中的[formIndex,toIndex)进行排序。
接下来再给大家设计一个利用Arrays.sort方法实现的排序案例。
public class Demo13 {
public static void main(String[] args) {
// 选择排序
//遍历排序后的数组
String[] names = { &#34;cxk&#34;, &#34;rose&#34;, &#34;lihua&#34;, &#34;lilei&#34;, &#34;zhaosi&#34; };
//直接利用Arrays类提供的数组排序的方法,内部是基于“快速排序”实现的。
Arrays.sort(names);
for (int i = 0; i < names.length; i++) {
System.out.print(names + &#34;\t&#34;);
}
}
}当然java数组就可以使用该方法来排序哦!!Arrays.sort()方法使用的是快速排序算法,可以对任意类型的数组进行排序,使用时需要实现Comparable接口或传入Comparator对象。
示例代码:
int[] nums = {5, 2, 9, 1, 5};
Arrays.sort(nums); // 对数组进行排序如果要对对象数组进行排序,需要实现Comparable接口或传入Comparator对象,示例代码:
class Person implements Comparable{
private String name;
private int age;
// ...省略构造方法和getter/setter方法
@Override
public int compareTo(Person o) {
return this.age - o.age;
}
}
Person[] persons = new Person[3];
persons[0] = new Person(&#34;Tom&#34;, 20);
persons[1] = new Person(&#34;Jerry&#34;, 18);
persons[2] = new Person(&#34;Mary&#34;, 22);
Arrays.sort(persons); // 对Person对象数组按照年龄升序排序另外,Java中还提供了其他排序算法的实现,例如归并排序、堆排序等,可以使用Collections.sort()方法或自己实现排序算法来实现数组排序。 |
|