前言
冒泡排序和选择排序是数据结构中最基本的排序算法,其中也是最常用的排序算法,下面我们的学习基本上是以思路分析、代码演示为主。
一、冒泡排序
冒泡排序(Bubble Sorting)的基本意思是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现则逆序交换,使值较大的元素逐渐从前向后移动。
因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行交换,就说明排序有序,因此要在排序的过程中设置一个标志flag判断元素是否进行过交换。从而减少不必要的比较。
1.冒泡排序案例加图解分析
下面是代码
public class Sort {
public static void main(String[] args) {
int[] arr = {3, 9, -1, 10, -2};
int temp = 0;
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]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println(Arrays.toString(arr));
}
}
}
根据上面的思路,我们可以对代码进行改进,增加一个flag标志来判断是否需要全部比较。
public class Sort {
public static void main(String[] args) {
int[] arr = {3, 9, -1, 10, 20};
int temp = 0;
boolean flag = false;
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]) {
flag = true;
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
if (!flag) {
//在一趟排序中,一次交换都没有发生
break;
} else {
//重置flag,进行下次判断
flag = false;
}
System.out.println(Arrays.toString(arr));
}
}
}
2.时间性能测试
我们可以使用random生成八万个随机数,然后使用冒泡排序进行排序,最后得到的时间为差不多11s(根据电脑不同可能会有所差异),可以看出这种排序方式的效率并不是很高。
二、选择排序
1.选择排序介绍
择排序也是一种简单的排序方法。它的基本思想是:第一次从arr[0]arr[n-1]中选取最小值,与arr[0]交换,第二次从arr[1]arr[n-1]中选取最小值,与arr[2]交换。。。一共通过n-1次,得到一个按顺序从小到大的有序序列。
选择排序代码实现:
/**
* 选择排序
* 时间复杂度 O(n^2)
*/
public static void selectSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
int minIndex = i;
int min = arr[i];
for (int j = i + 1; j < arr.length; j++) {
//找到最小值
if (min > arr[j]) {
min = arr[j];
minIndex = j;
}
}
//交换
if (minIndex != i) {
arr[minIndex] = arr[i];
arr[i] = min;
}
System.out.println("第" + (i+1) + "轮交换后:");
System.out.println(Arrays.toString(arr));
}
}
2.时间性能测试
我们同样可以使用random生成八万个随机数,然后使用选择排序进行再次测试,最后得到的时间为差不多2s(根据电脑不同可能会有所差异),可以看出选择排序在性能上是要比冒泡排序快很多的。