(C语言)八大排序之:堆排序、快速排序
堆排序( heap sort ) reference:http://mp.weixin.qq.com/s/mY_bVJPWhzZWL5ZdooA6tw
1 /* FILE: heapSort.c2 * DATE: 201801163 * --------------4 */5 6 #include <stdio.h>7 8 #define swap(a, b) do{ \9 (a) = (a) ^ (b); \10 (b) = (b) ^ (a); \11 (a) = (a) ^ (b); \12 }while(0)13 14 void heapAdjust(int *array, int parent, int length);15 void heapSort(int *array, int length);16 void print(int *array, int length);17 18 int main(int argc, char *argv[])19 {20 int a[] = {1,3,4,5,2,6,9,7,8,0};21 int len = sizeof(a) / sizeof(a[0]);22 printf("origin: ");23 print(a, len);24 heapSort(a, len);25 printf("heapSort: ");26 print(a, len);27 return 0;28 }29 30 void heapAdjust(int *array, int parent, int length)31 {32 int temp = array[parent]; // 保存当前父节点33 int child = 2 * parent + 1; // 先获得左孩子34 while(child < length)35 {36 if(child+1<length && array[child]<array[child+1])37 child++;38 // 如果父节点的值已经大于孩子节点的值,则直接结束39 if(temp >= array[child])40 break;41 // 孩子节点的值赋给父节点42 array[parent] = array[child];43 parent = child;44 child = 2 * parent + 1;45 }46 array[parent] = temp;47 }48 49 void heapSort(int *array, int length)50 {51 int i;52 // 循环建立初始堆53 for(i=length/2; i>=0; i--)54 {55 heapAdjust(array, i, length);56 printf("initialization: ");57 print(array, length);58 }59 // n-1次循环完成排序60 for(i=length-1; i>0; i--)61 {62 // 第一个和最后一个元素交换63 swap(array[i], array[0]);64 // 筛选[0]节点,得到i-1个节点的堆65 heapAdjust(array, 0, i);66 print(array, length);67 }68 }69 70 void print(int *array, int length)71 {72 int i;73 for(i=0; i<length; i++)74 printf("%d ", array[i]);75 printf("\n");76 }
快速排序( quick sort )
1 #include <stdio.h>2 3 #define swap(a, b) do{ \4 (a) = (a) ^ (b); \5 (b) = (b) ^ (a); \6 (a) = (a) ^ (b); \7 }while(0)8 9 void quickSort(int *array, int begin, int end);10 void print(int *array, int length);11 12 int main(int argc, char *argv[])13 {14 int a[] = {2,6,9,1,0,25,6};15 int len = sizeof(a) / sizeof(a[0]);16 print(a, len);17 quickSort(a, 0, len-1);18 print(a, len);19 20 return 0;21 }22 23 void quickSort(int *array, int begin, int end)24 {25 int left = begin;26 int right = end;27 int pivot = array[begin];28 if(begin >= end)29 return;30 while(left < right)31 {32 while((left<right) && (array[right] >= pivot))33 right--;34 swap(array[right], array[left]);35 while((left<right) && (array[left] < pivot))36 left++;37 swap(array[left], array[right]);38 }39 array[left] = pivot;40 quickSort(array, begin, left-1); // 递归41 quickSort(array, left+1, end);42 }43 44 void print(int *array, int length)45 {46 int i;47 for(i=0; i<length; i++)48 printf("%d ", array[i]);49 printf("\n");50 }
(C语言)八大排序之:堆排序、快速排序相关推荐
- C语言八大排序算法,附动图和详细代码解释!
文章来源:电子工程专辑.C语言与程序设计.竹雨听闲 一.前言 如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功. 想写出精炼.优秀的代码,不通过不断的锤炼,是很难做到的. 二. ...
- 硬核!C语言八大排序算法,附动图和详细代码解释!
来源 :C语言与程序设计.竹雨听闲等 一 前言 如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功. 想写出精炼.优秀的代码,不通过不断的锤炼,是很难做到的. 二 八大排序算法 ...
- 序列划分c语言,一篇“get”C语言八大排序算法
如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功. 想写出精炼.优秀的代码,不通过不断的锤炼,是很难做到的. 二.八大排序算法 排序算法作为数据结构的重要部分,系统地学习一下是 ...
- “手把手”教你C语言八大排序
C语言八大排序详解 目录 排序的概念及其应用 常见的八大排序算法 直接插入排序 直接插入排序代码实现 直接插入排序算法时间复杂度及稳定性分析 希尔排序 希尔排序代码实现 希尔排序算法时间复杂度及稳定性 ...
- c语言的八大排序算法,程序员的内功:C语言八大排序算法
四 一.冒泡排序 冒泡排序算法的运作如下: ●比较相邻的元素.如果第一个比第二个大,就交换他们两个. ●对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.这步做完后,最后的元素会是最大的数. ...
- 冒泡和快速排序的时间复杂度_java 八大排序算法 冒泡排序 快速排序 堆排序 归并排序 等...
八大排序算法 一.直接插入 1.基本思路 在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的.如此反复循环 ...
- C语言八大排序算法【详细 代码+图文】
这里写目录标题 1.冒泡排序 1.1 冒泡排序的思想 1.2 冒泡排序的实现 2.选择排序 2.1 选择排序的思想 2.2 选择排序的实现 3.直接插入排序 3.1 直接插入排序的思想 3.2 直接插 ...
- 八大排序算法--堆排序
序言 对于堆排序的学习,实际上就是对于 堆 这一种数据结构的学习,把堆学会了,堆排序自然也就学会了. 1.为什么使用堆这种数据结构 优先队列是一种很常用的队列,比如在游戏中,游戏角色在自动模式下,如何 ...
- 八大排序算法之快速排序(下篇)(快排的优化+非递归快排的实现)
目录 一.前言 1.快速排序的实现: 快速排序的单趟排序(排升序)(快慢指针法实现): 2.未经优化的快排的缺陷 二.快速排序的优化 1.三数取中优化 优化思路: 2. 小区间插入排序优化 小区间插 ...
最新文章
- PyTorch神经网络集成技术
- poj 1151(线段树求面积并)
- 2021云数据库RDS重磅升级发布会
- javascript系列之执行上下文
- OpenShift 4之评估节点自消耗的系统资源
- Markdown 调整图片位置与大小
- mysql经典sql语句大全_经典SQL语句大全
- 在 Ubuntu 18.04 上安装 Python 3.7
- 海康 hikvision SDK 初始化、登录、布防、监听
- PPT转换成图片及合成长图
- 0x0000000指令引用”0x0000000”内存,该内存不能为written
- 不可多求的压电式雨量传感器内部技术问答
- Android UI 测试指南之 Espresso
- 「 LaTex 」写论文,作者旁添加ORCID
- 5G QoS控制原理专题详解-基础概念(3)
- veins中实现rsu与车辆通信
- 给asus eeepc 1015pw的 1301版本的 bios添加slic2.1
- 字符串(varchar)和二进制(varbinary)互转
- React 报错与解决方法
- 电磁场的概念及常见电磁场产生设备
热门文章
- JDK动态代理为什么必须要基于接口?
- 永恒之蓝ms17-0109(缓冲区溢出漏洞)
- 为了能入职互联网大厂,我有多拼命
- 秋冬中式色彩趋势预测之传统美学——曼斯顿墙布墙面装饰创意品牌
- 打开doc文档提示Word 遇到问题需要关闭以安全模式启动解决办法
- 千匠星云数字化解决方案介绍 | 品牌官网数字化升级解决方案
- 数字逻辑组合电路分析练习题
- 深圳市工业和信息化局5G产业发展扶持计划操作规程
- 《selenium2自动化测试实战-基于python语言》第二遍
- 淘宝开放平台接口出租,top平台接口出租,订单R2权限出租,淘宝开放平台R2权限,淘宝开放平台进存销应用出租