Java排序算法实战:从基础到进阶,掌握排序算法精髓
发布时间: 2024-08-24 12:05:11 阅读量: 27 订阅数: 34
数组与排序算法:从基础到进阶
![Java排序算法实战:从基础到进阶,掌握排序算法精髓](https://img-blog.csdnimg.cn/ed576c8d39d74341a6a1affbe6f69402.png)
# 1. 排序算法基础**
排序算法是计算机科学中一项基本且重要的技术,用于对数据集合进行排序。排序算法的工作原理是将数据元素按一定顺序排列,例如升序或降序。
排序算法的性能通常由时间复杂度和空间复杂度来衡量。时间复杂度衡量算法执行所需的时间,而空间复杂度衡量算法执行所需的空间。不同的排序算法具有不同的时间和空间复杂度,因此选择合适的算法对于优化应用程序的性能至关重要。
排序算法有多种类型,每种类型都有其独特的优势和劣势。在本章中,我们将探讨排序算法的基础知识,包括其原理、实现和性能分析。
# 2. 基础排序算法
### 2.1 冒泡排序
#### 2.1.1 冒泡排序算法原理
冒泡排序是一种简单易懂的排序算法,其基本思想是将相邻元素两两比较,如果顺序错误,则交换它们的位置。重复这个过程,直到没有元素需要交换为止。
#### 2.1.2 冒泡排序算法实现
```java
public static void bubbleSort(int[] arr) {
int len = arr.length;
for (int i = 0; i < len - 1; i++) {
for (int j = 0; j < len - i - 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 < len - 1; i++):**外层循环控制冒泡次数,len - 1 表示冒泡到倒数第二个元素即可。
* **for (int j = 0; j < len - i - 1; j++):**内层循环控制每次冒泡比较的元素对,len - i - 1 表示每次冒泡只需要比较到当前冒泡次数的最后一个元素即可。
* **if (arr[j] > arr[j + 1]):**比较相邻元素,如果前一个元素大于后一个元素,则需要交换。
* **int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp;:**交换元素。
### 2.2 选择排序
#### 2.2.1 选择排序算法原理
选择排序也是一种简单的排序算法,其基本思想是每次从剩余元素中找到最小(或最大)的元素,并将其与当前未排序序列的第一个元素交换。重复这个过程,直到所有元素都被排序。
#### 2.2.2 选择排序算法实现
```java
public static void selectionSort(int[] arr) {
int len = arr.length;
for (int i = 0; i < len - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < len; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
```
**代码逻辑逐行解读:**
* **for (int i = 0; i < len - 1; i++):**外层循环控制选择排序次数,len - 1 表示选择到倒数第二个元素即可。
* **int minIndex = i;:**记录当前未排序序列中最小元素的索引。
* **for (int j = i + 1; j < len; j++):**内层循环查找当前未排序序列中最小元素。
* **if (arr[j] < arr[minIndex]):**比较元素,更新最小元素的索引。
* **int temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp;:**交换元素。
### 2.3 插入排序
#### 2.3.1 插入排序算法原理
插入排序是一种高效且稳定的排序算法,其基本思想是将待排序元素逐个插入到已排序序列中。从第二个元素开始,每次将当前元素与已排序序列中的元素比较,找到合适的插入位置,然后将当前元素插入到该位置。
#### 2.3.2 插入排序算法实现
```java
public static void insertionSort(int[] arr) {
int len = arr.length;
for (int i = 1; i < len; i++) {
int key = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
}
```
**代码逻辑逐行解读:**
* **for (int i = 1; i < len; i++):**外层循环控制插入排序次数,从第二个元素开始。
* **int key = arr[i];:**保存当前待插入元素。
* **int j = i - 1;:**记录已排序序列中最后一个元素的索引。
* **while (j >= 0 && arr[j] > key):**内层循环比较元素并移动元素,找到待插入元素的合适位置。
* **arr[j + 1] = key;:**将待插入元素插入到合适位置。
# 3.1 快速排序
#### 3.1.1 快速排序算法原理
快速排序是一种分治算法,它通过将数组分成两个子数组(左子数组和右子数组)来工作。左子数组包含小于或等于枢纽元素(数组中任意元素)的所有元素,而右子数组包含大于枢纽元素的所有元素。然后递归地对这两个子数组应用快速排序。
#### 3.1.2 快速排序算法实现
```java
public static void quickSort(int[] arr, int low, int high) {
if (low < high) {
int partitionIndex = partition(arr, low, high);
// 对左子数组进行快速排序
quickSort(arr, low, partitionIndex - 1);
// 对右子数组进行快速排序
quickSort(arr, partitionIndex + 1, high);
}
}
private static int partition(int[] arr, int low, int high) {
// 选择枢纽元素
int pivot = arr[high];
// 将比枢纽元素小的元素移动到左边
int i = (low - 1);
for (int j = low; j <= high - 1; j++) {
if (arr[j] < pivot) {
i++;
swap(arr, i, j);
}
}
swap(arr, i + 1, high);
return (i + 1);
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
```
**代码逻辑逐行解读:**
* **quickSort()** 方法:快速排序算法的主方法,它采用分治策略,将数组分成左子数组和右子数组,并递归地对它们进行排序。
* **partition()** 方法:分区函数,它选择一个枢纽元素,将比枢纽元素小的元素移动到左边,比枢纽
0
0