八大经典排序算法

server/2025/2/25 7:59:17/

八大经典算法>排序算法

目录

  1. 算法概览
  2. 算法详解
    • 冒泡排序
    • 选择排序
    • 插入排序
    • 希尔排序
    • 归并排序
    • 快速排序
    • 堆排序
    • 计数排序
  3. 性能对比

1. 算法概览

算法>排序算法平均时间复杂度空间复杂度稳定性排序方式
冒泡排序O(n²)O(1)稳定In-place
选择排序O(n²)O(1)不稳定In-place
插入排序O(n²)O(1)稳定In-place
希尔排序O(n log n)O(1)不稳定In-place
归并排序O(n log n)O(n)稳定Out-place
快速排序O(n log n)O(log n)不稳定In-place
堆排序O(n log n)O(1)不稳定In-place
计数排序O(n + k)O(k)稳定Out-place

2. 算法详解

2.1 冒泡排序

基本思想:通过相邻元素比较交换,使最大元素"浮"到末尾
动图演示:气泡从水底逐渐上浮的过程

void bubble_sort(int arr[], int n) {for (int i = 0; i < n-1; i++) {int swapped = 0;for (int j = 0; j < n-i-1; j++) {if (arr[j] > arr[j+1]) {swap(&arr[j], &arr[j+1]);swapped = 1;}}if (!swapped) break; // 提前终止优化}
}

2.2 选择排序

基本思想:每次选择最小元素放到已排序序列末尾

void selection_sort(int arr[], int n) {for (int i = 0; i < n-1; i++) {int min_idx = i;for (int j = i+1; j < n; j++) {if (arr[j] < arr[min_idx]) min_idx = j;}swap(&arr[i], &arr[min_idx]);}
}

2.3 插入排序

基本思想:将未排序元素插入已排序序列合适位置

void insertion_sort(int arr[], int n) {for (int i = 1; i < n; 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;}
}

2.4 希尔排序

基本思想:分组插入排序,逐步缩小间隔

void shell_sort(int arr[], int n) {for (int gap = n/2; gap > 0; gap /= 2) {for (int i = gap; i < n; i++) {int temp = arr[i];int j;for (j = i; j >= gap && arr[j-gap] > temp; j -= gap)arr[j] = arr[j-gap];arr[j] = temp;}}
}

2.5 归并排序

基本思想:分治法,先拆分再合并有序子序列

void merge(int arr[], int l, int m, int r) {// 合并操作实现
}void merge_sort(int arr[], int l, int r) {if (l < r) {int m = l + (r - l)/2;merge_sort(arr, l, m);merge_sort(arr, m+1, r);merge(arr, l, m, r);}
}

2.6 快速排序

基本思想:选取基准值进行分区排序

int partition(int arr[], int low, int high) {int pivot = arr[high];int i = low - 1;for (int j = low; j < high; j++) {if (arr[j] < pivot) {i++;swap(&arr[i], &arr[j]);}}swap(&arr[i+1], &arr[high]);return i+1;
}void quick_sort(int arr[], int low, int high) {if (low < high) {int pi = partition(arr, low, high);quick_sort(arr, low, pi-1);quick_sort(arr, pi+1, high);}
}

2.7 堆排序

基本思想:利用堆结构进行选择排序

void heapify(int arr[], int n, int i) {// 堆调整实现
}void heap_sort(int arr[], int n) {for (int i = n/2-1; i >= 0; i--)heapify(arr, n, i);for (int i = n-1; i > 0; i--) {swap(&arr[0], &arr[i]);heapify(arr, i, 0);}
}

2.8 计数排序

适用场景:整数排序,数据范围较小

void counting_sort(int arr[], int n) {int max = arr[0], min = arr[0];for (int i = 1; i < n; i++) {if (arr[i] > max) max = arr[i];if (arr[i] < min) min = arr[i];}int range = max - min + 1;int *count = calloc(range, sizeof(int));for (int i = 0; i < n; i++)count[arr[i] - min]++;int idx = 0;for (int i = 0; i < range; i++) {while (count[i]--) arr[idx++] = i + min;}free(count);
}

3. 性能对比

算法>排序算法最佳情况最差情况适用场景
冒泡排序O(n)O(n²)小规模数据/基本有序数据
快速排序O(n log n)O(n²)通用排序/大规模随机数据
归并排序O(n log n)O(n log n)链表排序/外部排序
堆排序O(n log n)O(n log n)内存受限场景
计数排序O(n + k)O(n + k)整数排序/范围较小数据

选择建议

  • 小规模数据:插入排序
  • 通用场景:快速排序
  • 稳定性要求:归并排序
  • 内存敏感:堆排序
  • 特殊场景:计数排序(数据范围小)

完整代码实现建议在本地IDE中测试运行,理解算法原理后尝试手写实现


http://www.ppmy.cn/server/170511.html

相关文章

论文略:ACloser Look into Mixture-of-Experts in Large Language Models

202406 arxiv 关于这几个MOE的详细实验 主要实验发现&#xff1a; Mixtral可能包含具有独特属性的专家DeepSeek和Grok的专家权重矩阵的相似性通常低于Mixtral&#xff08;DeepSeek和Grok专家的矩阵级相似性通常接近零&#xff0c;而Mixtral专家的相似性平均约为0.3&#xff09…

蓝桥杯试题:区间次方和(前缀和)

活动发起人小虚竹 想对你说&#xff1a; 这是一个以写作博客为目的的创作活动&#xff0c;旨在鼓励大学生博主们挖掘自己的创作潜能&#xff0c;展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴&#xff0c;那么&#xff0c;快来参加吧&#xff01…

哈希表入门到精通:从原理到 Python 实现全解析

系列文章目录 01-从零开始掌握Python数据结构&#xff1a;提升代码效率的必备技能&#xff01; 02-算法复杂度全解析&#xff1a;时间与空间复杂度优化秘籍 03-线性数据结构解密&#xff1a;数组的定义、操作与实际应用 04-深入浅出链表&#xff1a;Python实现与应用全面解析 …

证券相关知识

证券市场分为发行市场&#xff08;Primary Market・プライマリーマーケット&#xff09;和流通市场&#xff08;Secondary Market・セカンダリーマーケット&#xff09; 股票&#xff0c;企业筹集资金的手段之一。英语中叫做“Stock”&#xff0c;有储蓄的意思&#xff0c;是与…

【网络安全】常见的web攻击

1、SQL注入攻击 定义&#xff1a; 攻击者在HTTP请求中注入恶意的SQL代码&#xff0c;当服务器利用参数构建SQL语句的时候&#xff0c;恶意的SQL代码被一起构建,并在数据库中执行。 示例&#xff1a; 用户登录&#xff1a; 输入用户名xx&#xff0c; 密码 or 1 …

游戏引擎学习第107天

仓库:https://gitee.com/mrxiao_com/2d_game_2 回顾我们之前停留的位置 在这段内容中&#xff0c;讨论了如何处理游戏中的三维效果&#xff0c;特别是如何处理额外的“Z层”。由于游戏中的艺术资源是位图而不是3D模型&#xff0c;因此实现三维效果变得非常具有挑战性。虽然可…

23种设计模式 - 工厂方法模式

模式定义 工厂方法模式&#xff08;Factory Method Pattern&#xff09;是一种创建型设计模式&#xff0c;定义用于创建对象的接口&#xff0c;让子类决定实例化哪个类&#xff0c;从而将对象创建过程延迟到子类。其核心目的是解耦对象的创建与使用&#xff0c;增强系统的扩展…

基金基础知识

一、基金的本质与价值 定义&#xff1a; 基金是通过集合投资者资金&#xff0c;由专业管理人&#xff08;基金经理&#xff09;进行多元化投资&#xff08;如股票、债券等&#xff09;的金融工具&#xff0c;收益按持有份额分配。 核心优势&#xff1a; 分散风险&#xff1a;…