一、Java中的八大排序算法:
1. 冒泡排序 O(n^2) O(1) 冒泡排序是一种稳定的排序算法,但它的效率相对较低,特别是对于大数据集。
2. 选择排序 O(n^2) O(1) 选择排序也是一种效率较低的排序算法,因为它需要多次交换元素。
二、时间复杂度和空间复杂度
- 时间复杂度定义:
时间复杂度是用来估算算法运行时间的一个表达式,通常用大O符号(O-notation)表示。它描述了算法运行时间如何随着输入数据规模的变化而变化。时间复杂度通常与算法中基本操作的执行次数相关,而不是实际的运行时间,因为实际的运行时间还会受到计算机硬件、操作系统、编译器等多种因素的影响。
- 空间复杂度定义:
空间复杂度是用来估算算法在运行过程中额外使用内存或存储的量度。它同样使用大O符号来表示。空间复杂度考虑的是算法在执行过程中临时占用的大小,不包括输入数据本身的大小。
三、冒泡排序的基本步骤及代码演示
3.1冒泡排序的基本步骤:
1.从数列的第一个元素开始,比较相邻的两个元素,如果前一个元素大于后一个元素,则交换它们的位置。
2.重复上述比较和交换操作,直到遍历完整个数列,此时最大的元素将被放置在数列的最后一个位置。
3.对未排序的部分重复步骤1和步骤2,直至整个数列完全有序。具体来说,每次迭代都从数列的第一个未排序元素开始,比较相邻的元素并在必要时交换它们的位置,直到遍历完整个未排序部分。
3.2代码演示
public static void bubble(int[] arr) {
boolean flag;
for (int i = 0;i < arr.length - 1;i++)
flag = false;
for (int j = 0;j < arr.length - i - 1; j++) {
if (arr[j] > arr[j +1]) [
//交换 arr[j] 和arr[j +1]
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
// 标记发生了交换
flag = true;
}
//如果没有发生交换,则数组已经排序完成
if (!flag) }
break;
}}
}
四、选择排序的步骤及代码演示
4.1选择排序的步骤:
-
找到未排序部分中的最小值和其下标。
-
将最小值和未排序部分的起始位置元素进行交换。
-
重复以上两个步骤,直到所有元素都被排序
4.2选择排序的代码演示:
public void selection(int[] arr) {
int n = arr.length; // 数组长度
for (int i = 0; i < n - 1; i++) { // 外层循环控制排序次数
int minIdx = i; // 保存最小元素的下标
for (int j = i + 1; j < n; j++) { // 内层循环查找未排序部分的最小元素
if (arr[j] < arr[minIdx]) {
minIdx = j;
}
}
// 将最小元素和未排序部分的第一个元素进行交换
int tmp = arr[minIdx];
arr[minIdx] = arr[i];
arr[i] = tmp;
}
}
}
五、选择排序和冒泡排序的比较
- 冒泡排序是比较相邻位置的两个数,而选择排序是按顺序比较,找最大值或者最小值。
- 冒泡排序每一轮比较后,位置不对都需要换位置,选择排序每一轮比较都只需要换一次位置。
- 冒泡排序是通过数去找位置,选择排序是给定位置去找数。