目录

1. 冒泡排序
a. 思路
- 外层循环控制次数,用来一次确定 len - 1, len - 2,len - 3, ... ,0 位置的数
- 内层循环遍历的过程中比较相邻两个数,将较大的数放置到数组右边

b. code
void bubble_sort(int arr[]) {
for (int i = 0; i < len; i++) {
for (int j = 0; j < len - i - 1; j ++) {
if (arr[j + 1] < arr[j]) {
swap(arr, j, j + 1);
}
}
}
}
package bubble_sort;
public class Main {
/**
* @description: 冒泡排序
* @param arr
* @return void
* @date: 2023/7/17 20:25
*/
private static void bubbleSort(int[] arr) {
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length - i - 1; j ++) {
// 比较相邻两个数的大小,将较大的数移动到右边
if (arr[j + 1] < arr[j]) {
swap(arr, j, j + 1);
}
}
}
}
}
2. 插入排序
a. 思路
- 默认第一个数有序
- 从 index = 1 开始遍历数组,将第 i 个数倒序同之前的数进行比较并插入使得前 i + 1 项有序

b. code
void insert_sort(int arr[]) {
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;
}
}
package insert_sort;
public class Main {
/**
* @description: 插入排序
* @param arr
* @return void
* @date: 2023/7/17 23:21
*/
private static void insertSort(int[] arr) {
for (int i = 1; i < arr.length; 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;
}
}
}
3. 希尔排序【插入排序plus】
a. 思路
- 设置循环增量 gap,迭代 gap /= 2
- 每次循环对 【i,i + gap,i + 2 * gap...】(i in [0,gap])进行插入排序

b. code
void shell_sort(int arr[]) {
// 初始增量 len / 2, 每次循环后, 增量 /= 2
for (int gap = len / 2; gap > 0; gap /= 2) {
// 每次采用插入排序
for (int i = gap, j; i < len; i ++) {
int key = arr[i];
for (j = i; j >= gap && key < arr[j - gap]; j -= gap) {
arr[j] = arr[j - gap];
}
arr[j] = key;
}
}
}
package shell_sort;
public class Main {
/**
* @description: 希尔排序
* @param arr
* @return void
* @date: 2023/7/24 2:20
*/
private static void shellSort(int[] arr) {
// 初始增量 len / 2, 每次循环后, 增量 /= 2
for (int gap = arr.length / 2; gap > 0; gap /= 2) {
// 每次采用插入排序
for (int i = gap, j; i < arr.length; i ++) {
int key = arr[i];
for (j = i; j >= gap && key < arr[j - gap]; j -= gap) {
arr[j] = arr[j - gap];
}
arr[j] = key;
}
}
}
}
4. 选择排序
a. 思路
- 外层循环控制当前排序的位置
- 内层循环遍历 i + 1 ~ j,查找arr在 i ~ j 上的最小数的索引
- 然后将查找到的最小的数与 arr[i] 交换顺
十大经典排序算法实现与解析

本文详细介绍了包括冒泡排序、插入排序、希尔排序、选择排序、基数排序、计数排序、桶排序、归并排序、快速排序和堆排序在内的十大排序算法,分别阐述了它们的基本思路并提供了C++和Java语言的代码实现。这些排序算法涵盖了简单的交换排序、选择排序、分治策略以及基于桶和计数的排序方法。
最低0.47元/天 解锁文章
18万+

被折叠的 条评论
为什么被折叠?



