十大排序算法详解

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

目录

1. 冒泡排序

a. 思路

b. code

2. 插入排序

a. 思路

b. code

3. 希尔排序【插入排序plus】

a. 思路

b. code

4. 选择排序

a. 思路

b. code

5. 基数排序

a. 前置知识

b. 思路

c. code

6. 计数排序

a. 思路

b. code

7. 桶排序(计数排序plus & 基于分治)

a. 思路

b. code

8. 归并(基于分治)

a. 思路

b. code

9. 快排(基于分治)

a. 思路

b. code

10. 堆排序(以大顶堆为例)

a. 前置知识

b. 思路

c. code

11. 测试代码


1. 冒泡排序

a. 思路

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

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. 思路

  1. 默认第一个数有序
  2. 从 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. 思路

  1. 设置循环增量 gap,迭代 gap /= 2
  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. 思路

  1. 外层循环控制当前排序的位置
  2. 内层循环遍历 i + 1 ~ j,查找arr在 i ~ j 上的最小数的索引
  3. 然后将查找到的最小的数与 arr[i] 交换顺
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值