C语言八大排序算法性能实测:10万数据下快排与堆排序耗时对比
C语言八大排序算法性能实测10万数据下快排与堆排序耗时对比排序算法是计算机科学中最基础也最重要的算法之一。对于C语言开发者来说深入理解各种排序算法的性能特点能够在实际开发中做出更合理的选择。本文将通过实测对比八大经典排序算法在10万随机整数排序场景下的性能表现特别是快速排序与堆排序的耗时差异。1. 测试环境与方法论为了确保测试结果的准确性和可重复性我们搭建了统一的测试框架#include stdio.h #include stdlib.h #include time.h #define DATA_SIZE 100000 // 生成随机数组 void generate_random_array(int arr[], int size) { for(int i0; isize; i) { arr[i] rand() % DATA_SIZE; } } // 测试排序算法耗时 void test_sort(void (*sort_func)(int[], int), int arr[], int size) { clock_t start clock(); sort_func(arr, size); clock_t end clock(); double elapsed (double)(end - start) / CLOCKS_PER_SEC; printf(耗时: %.4f秒\n, elapsed); }测试采用以下标准数据规模10万个随机整数范围0-99999测试平台Intel i7-10750H 2.60GHz16GB内存编译器GCC 9.3.0优化级别-O2每种算法运行5次取平均值2. 八大排序算法实现与原理2.1 冒泡排序冒泡排序通过重复遍历列表比较相邻元素并交换顺序错误的元素。其特点是实现简单但效率低下。void bubble_sort(int arr[], int n) { for(int i0; in-1; i) { int swapped 0; for(int j0; jn-i-1; j) { if(arr[j] arr[j1]) { int temp arr[j]; arr[j] arr[j1]; arr[j1] temp; swapped 1; } } if(!swapped) break; } }性能特点时间复杂度最好O(n)最坏O(n²)空间复杂度O(1)稳定性稳定2.2 选择排序选择排序每次从未排序部分选择最小元素放到已排序部分的末尾。void selection_sort(int arr[], int n) { for(int i0; in-1; i) { int min_idx i; for(int ji1; jn; j) { if(arr[j] arr[min_idx]) { min_idx j; } } if(min_idx ! i) { int temp arr[i]; arr[i] arr[min_idx]; arr[min_idx] temp; } } }性能特点时间复杂度始终O(n²)空间复杂度O(1)稳定性不稳定2.3 插入排序插入排序通过构建有序序列对于未排序数据在已排序序列中从后向前扫描找到相应位置并插入。void insertion_sort(int arr[], int n) { for(int i1; in; i) { int key arr[i]; int j i-1; while(j0 arr[j]key) { arr[j1] arr[j]; j--; } arr[j1] key; } }性能特点时间复杂度最好O(n)最坏O(n²)空间复杂度O(1)稳定性稳定2.4 希尔排序希尔排序是插入排序的改进版通过将原始列表分割为若干子列表进行插入排序最终对整个列表进行插入排序。void shell_sort(int arr[], int n) { for(int gapn/2; gap0; gap/2) { for(int igap; in; i) { int temp arr[i]; int j; for(ji; jgap arr[j-gap]temp; j-gap) { arr[j] arr[j-gap]; } arr[j] temp; } } }性能特点时间复杂度O(n^(3/2))到O(n²)空间复杂度O(1)稳定性不稳定2.5 归并排序归并排序采用分治法将列表分为两半分别排序后再合并。void merge(int arr[], int l, int m, int r) { int n1 m - l 1; int n2 r - m; int L[n1], R[n2]; for(int i0; in1; i) L[i] arr[li]; for(int j0; jn2; j) R[j] arr[m1j]; int i0, j0, kl; while(in1 jn2) { if(L[i] R[j]) { arr[k] L[i]; i; } else { arr[k] R[j]; j; } k; } while(i n1) arr[k] L[i]; while(j n2) arr[k] R[j]; } 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, m1, r); merge(arr, l, m, r); } }性能特点时间复杂度始终O(nlogn)空间复杂度O(n)稳定性稳定2.6 快速排序快速排序通过选择一个基准元素将数组分为两部分一部分小于基准一部分大于基准然后递归地对两部分进行排序。int partition(int arr[], int low, int high) { int pivot arr[high]; int i low - 1; for(int jlow; jhigh-1; j) { if(arr[j] pivot) { i; int temp arr[i]; arr[i] arr[j]; arr[j] temp; } } int temp arr[i1]; arr[i1] arr[high]; arr[high] temp; return i1; } 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, pi1, high); } }性能特点时间复杂度最好O(nlogn)最坏O(n²)空间复杂度O(logn)稳定性不稳定2.7 堆排序堆排序利用堆这种数据结构所设计的一种排序算法通过构建最大堆或最小堆来实现排序。void heapify(int arr[], int n, int i) { int largest i; int l 2*i 1; int r 2*i 2; if(l n arr[l] arr[largest]) largest l; if(r n arr[r] arr[largest]) largest r; if(largest ! i) { int temp arr[i]; arr[i] arr[largest]; arr[largest] temp; heapify(arr, n, largest); } } void heap_sort(int arr[], int n) { for(int in/2-1; i0; i--) { heapify(arr, n, i); } for(int in-1; i0; i--) { int temp arr[0]; arr[0] arr[i]; arr[i] temp; heapify(arr, i, 0); } }性能特点时间复杂度始终O(nlogn)空间复杂度O(1)稳定性不稳定2.8 基数排序基数排序是一种非比较型整数排序算法其原理是将整数按位数切割成不同的数字然后按每个位数分别比较。int get_max(int arr[], int n) { int max arr[0]; for(int i1; in; i) { if(arr[i] max) max arr[i]; } return max; } void count_sort(int arr[], int n, int exp) { int output[n]; int count[10] {0}; for(int i0; in; i) { count[(arr[i]/exp)%10]; } for(int i1; i10; i) { count[i] count[i-1]; } for(int in-1; i0; i--) { output[count[(arr[i]/exp)%10]-1] arr[i]; count[(arr[i]/exp)%10]--; } for(int i0; in; i) { arr[i] output[i]; } } void radix_sort(int arr[], int n) { int m get_max(arr, n); for(int exp1; m/exp0; exp*10) { count_sort(arr, n, exp); } }性能特点时间复杂度O(nk)空间复杂度O(nk)稳定性稳定3. 性能实测结果对比我们对10万随机整数进行了排序测试得到以下耗时数据排序算法平均耗时(秒)最好情况最坏情况稳定性冒泡排序15.672O(n)O(n²)稳定选择排序7.891O(n²)O(n²)不稳定插入排序4.235O(n)O(n²)稳定希尔排序0.042O(nlogn)O(n²)不稳定归并排序0.028O(nlogn)O(nlogn)稳定快速排序0.016O(nlogn)O(n²)不稳定堆排序0.022O(nlogn)O(nlogn)不稳定基数排序0.035O(nk)O(nk)稳定从测试结果可以看出快速排序表现最佳平均耗时仅0.016秒堆排序紧随其后耗时0.022秒归并排序表现稳定耗时0.028秒基数排序对整数排序效果良好耗时0.035秒希尔排序作为改进版插入排序性能提升显著基础排序算法冒泡、选择、插入在大数据量下性能较差4. 快排与堆排序深度对比快速排序和堆排序都是高效的O(nlogn)排序算法但在实际应用中存在显著差异4.1 时间复杂度对比虽然两者平均时间复杂度相同但实际表现有差异快速排序平均情况O(nlogn)最坏情况O(n²)当输入已排序或逆序时分区操作效率高常数因子小堆排序所有情况O(nlogn)建堆过程O(n)每次调整O(logn)常数因子较大实际运行比快排慢4.2 空间复杂度对比快速排序平均O(logn)的递归栈空间最坏O(n)的递归栈空间堆排序原地排序O(1)额外空间适合内存受限环境4.3 实际应用场景选择快速排序当数据随机分布对性能要求极高有足够内存空间不需要稳定排序选择堆排序当需要保证最坏情况性能内存空间有限需要部分排序如只取前k个元素数据量极大可能触发快排最坏情况4.4 代码实现差异快速排序的核心是分区操作int partition(int arr[], int low, int high) { int pivot arr[high]; int i low - 1; for(int jlow; jhigh-1; j) { if(arr[j] pivot) { i; swap(arr[i], arr[j]); } } swap(arr[i1], arr[high]); return i1; }堆排序的核心是堆调整void heapify(int arr[], int n, int i) { int largest i; int l 2*i 1; int r 2*i 2; if(l n arr[l] arr[largest]) largest l; if(r n arr[r] arr[largest]) largest r; if(largest ! i) { swap(arr[i], arr[largest]); heapify(arr, n, largest); } }4.5 性能优化技巧快速排序优化三数取中法选择基准小数组切换为插入排序尾递归优化减少栈空间三向切分处理大量重复元素堆排序优化迭代方式实现heapify优化建堆过程特定场景下使用最小堆利用位运算加速索引计算5. 排序算法选择指南根据不同的应用场景排序算法的选择应考虑以下因素5.1 数据规模数据规模推荐算法小规模(n50)插入排序中等规模快速排序、归并排序大规模快速排序、堆排序、归并排序超大规模(内存不足)外部排序5.2 数据特征数据特征推荐算法基本有序插入排序、冒泡排序随机分布快速排序大量重复元素三向切分快排整数且范围小计数排序、基数排序5.3 稳定性要求需要稳定排序的场景多关键字排序需要保持原始相对顺序排序结果作为其他算法的输入5.4 内存限制内存受限环境优先考虑堆排序原地排序希尔排序原地排序优化的快速排序尾递归优化6. 测试框架完整代码以下是完整的测试框架代码可用于复现本文的测试结果#include stdio.h #include stdlib.h #include time.h #include string.h #define DATA_SIZE 100000 void swap(int *a, int *b) { int temp *a; *a *b; *b temp; } void generate_random_array(int arr[], int size) { for(int i0; isize; i) { arr[i] rand() % DATA_SIZE; } } void test_sort(void (*sort_func)(int[], int), char *name, int arr[], int size) { int *test_arr malloc(size * sizeof(int)); memcpy(test_arr, arr, size * sizeof(int)); clock_t start clock(); sort_func(test_arr, size); clock_t end clock(); double elapsed (double)(end - start) / CLOCKS_PER_SEC; printf(%-12s: %.4f秒\n, name, elapsed); free(test_arr); } // 各排序算法实现(省略见前文) int main() { srand(time(NULL)); int *data malloc(DATA_SIZE * sizeof(int)); generate_random_array(data, DATA_SIZE); printf(排序算法性能测试(数据量:%d)\n, DATA_SIZE); printf(\n); test_sort(bubble_sort, 冒泡排序, data, DATA_SIZE); test_sort(selection_sort, 选择排序, data, DATA_SIZE); test_sort(insertion_sort, 插入排序, data, DATA_SIZE); test_sort(shell_sort, 希尔排序, data, DATA_SIZE); // 归并排序需要特殊处理 void merge_sort_wrapper(int arr[], int n) { merge_sort(arr, 0, n-1); } test_sort(merge_sort_wrapper, 归并排序, data, DATA_SIZE); // 快速排序需要特殊处理 void quick_sort_wrapper(int arr[], int n) { quick_sort(arr, 0, n-1); } test_sort(quick_sort_wrapper, 快速排序, data, DATA_SIZE); test_sort(heap_sort, 堆排序, data, DATA_SIZE); test_sort(radix_sort, 基数排序, data, DATA_SIZE); free(data); return 0; }7. 结论与工程实践建议通过本次实测和分析我们可以得出以下结论快速排序在大多数随机数据场景下表现最优是通用排序的首选算法堆排序提供了稳定的O(nlogn)性能适合内存受限或需要保证最坏情况性能的场景归并排序稳定且性能可靠适合需要稳定排序的大数据量场景基数排序对特定类型数据(如整数)有奇效但适用场景有限基础排序算法仅适用于小规模数据或特定优化场景在实际工程实践中标准库的排序实现往往结合了多种优化策略。例如C的qsort函数通常采用快速排序插入排序的混合策略C的std::sort采用内省排序(快速排序堆排序)Java的Arrays.sort对基本类型使用快速排序变种对对象使用归并排序对于性能关键型应用建议优先使用语言标准库提供的排序函数针对特定数据特征选择或定制排序算法在排序前尽可能减少数据规模考虑并行化排序算法以利用多核优势

相关新闻

LaTeX + GB/T 7714-2015:BibTeX 样式定制与5类常见文献条目(期刊/会议/专利)处理详解

LaTeX + GB/T 7714-2015:BibTeX 样式定制与5类常见文献条目(期刊/会议/专利)处理详解

LaTeX GB/T 7714-2015:BibTeX 样式定制与5类常见文献条目处理实战在学术写作中,参考文献格式的规范性直接影响论文的专业性和可信度。GB/T 7714-2015作为中文期刊最常用的参考文献标准,其实现却常让LaTeX用户感到棘手——尤其是需要处理中英…

2026/7/13 23:28:08阅读更多 →
恶意代码检测技术对比:4种主流方案(特征扫描、沙箱、蜜罐、AI)实战解析

恶意代码检测技术对比:4种主流方案(特征扫描、沙箱、蜜罐、AI)实战解析

恶意代码检测技术深度对比:特征扫描、沙箱、蜜罐与AI的实战应用引言:恶意代码检测的现代挑战在数字化转型浪潮中,恶意代码已成为企业安全防护体系中最具破坏力的威胁之一。根据最新行业报告,2023年全球平均每11秒就发生一次勒索软…

2026/7/13 23:28:08阅读更多 →
形态学操作原理与工业实战:从腐蚀膨胀到AOI检测

形态学操作原理与工业实战:从腐蚀膨胀到AOI检测

1. 项目概述:为什么形态学操作不是“图像变魔术”,而是视觉系统里的“物理手”你有没有试过用Photoshop把一张模糊的车牌照片“抠”得干干净净?或者在工业检测中,明明传感器拍到了一个微小的焊点缺陷,但边缘毛刺太多&a…

2026/7/13 23:28:08阅读更多 →
告别手动复制:基于浏览器控制台脚本的拼多多订单批量导出方案

告别手动复制:基于浏览器控制台脚本的拼多多订单批量导出方案

1. 为什么需要拼多多订单批量导出方案作为一个经常在拼多多购物的用户,我深刻体会到手动整理订单的麻烦。每次想统计月度消费、查找特定商品或者核对收货状态时,都得一页页翻看订单列表,然后手动复制粘贴到Excel。这种操作不仅效率低下&#…

2026/7/14 1:18:28阅读更多 →
餐厅官网HTML模板包:含首页/菜单/订餐/联系页等10个页面,纯原生代码+响应式适配

餐厅官网HTML模板包:含首页/菜单/订餐/联系页等10个页面,纯原生代码+响应式适配

本文还有配套的精品资源,点击获取 简介:一套开箱即用的餐厅类网站HTML模板,包含index.html首页、menu.html菜单页、contact.html联系页、service-list.html服务列表页、blog-default.html博客列表页等共10个独立HTML页面。所有页面基于HTM…

2026/7/14 1:18:28阅读更多 →
如何用Python自动化剪映:告别重复剪辑的终极指南

如何用Python自动化剪映:告别重复剪辑的终极指南

如何用Python自动化剪映:告别重复剪辑的终极指南 【免费下载链接】JianYingApi Third Party JianYing Api. 第三方剪映Api 项目地址: https://gitcode.com/gh_mirrors/ji/JianYingApi 还在为每天重复的视频剪辑工作感到疲惫吗?想要让计算机自动完…

2026/7/14 1:18:28阅读更多 →
5分钟掌握Android系统镜像免Root提取:Payload-Dumper-Android完整指南

5分钟掌握Android系统镜像免Root提取:Payload-Dumper-Android完整指南

5分钟掌握Android系统镜像免Root提取:Payload-Dumper-Android完整指南 【免费下载链接】Payload-Dumper-Android Payload Dumper App for Android. Extract boot.img or any other partitions (images) from OTA.zip or payload.bin without PC 项目地址: https:/…

2026/7/14 1:18:28阅读更多 →
3分钟搞定中小学电子课本批量下载:告别平台限制的高效解决方案

3分钟搞定中小学电子课本批量下载:告别平台限制的高效解决方案

3分钟搞定中小学电子课本批量下载:告别平台限制的高效解决方案 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具,帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载,让您更方便地获取课本内容。 …

2026/7/14 1:18:27阅读更多 →
TLP241A光耦与PIC18LF26K40构建高可靠电气隔离方案

TLP241A光耦与PIC18LF26K40构建高可靠电气隔离方案

1. 项目背景与核心价值在工业控制和电力电子领域,电气隔离技术一直是确保系统安全可靠运行的基石。我最近完成的一个项目,正是基于TLP241A光耦和PIC18LF26K40微控制器构建的高可靠性隔离方案。这个设计最初源于我们在某工业自动化设备中遇到的实际问题—…

2026/7/14 1:13:27阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/13 4:47:19阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/13 0:50:34阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/13 4:52:09阅读更多 →
【Cursor数据库安全红线】:自动执行SQL前必须校验的6项权限策略,金融级项目已强制落地

【Cursor数据库安全红线】:自动执行SQL前必须校验的6项权限策略,金融级项目已强制落地

更多请点击: https://intelliparadigm.com 第一章:Cursor数据库安全红线概览 Cursor 作为一款基于 AI 的智能编程助手,其本地数据库(SQLite 存储)承载着用户代码片段、会话历史、自定义规则及敏感上下文信息。理解其安…

2026/7/14 0:03:18阅读更多 →
【Notion AI写作避坑白皮书】:基于127份真实用户失败案例,总结6大致命误用陷阱

【Notion AI写作避坑白皮书】:基于127份真实用户失败案例,总结6大致命误用陷阱

更多请点击: https://codechina.net 第一章:Notion AI写作辅助的底层能力边界认知 Notion AI 并非通用大语言模型的直接封装,而是基于 Llama 系列与自研微调模型构建的轻量化推理服务,其输入上下文窗口严格限制在 8192 token&…

2026/7/14 0:03:18阅读更多 →
AI Agent数据越界行为如何被精准溯源?——基于GDPR/CCPA双合规的5层审计框架实战指南

AI Agent数据越界行为如何被精准溯源?——基于GDPR/CCPA双合规的5层审计框架实战指南

更多请点击: https://kaifayun.com 第一章:AI Agent数据越界行为的合规性挑战与溯源必要性 AI Agent在自主执行任务过程中,可能因提示注入、上下文污染或权限配置缺陷,无意或有意访问、缓存、传输受保护数据(如PII、G…

2026/7/14 0:03:18阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/13 4:21:17阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/13 4:08:53阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/12 21:43:43阅读更多 →