归并排序和堆排序讲解
可爱的皮卡丘 (#^.^#)
文章目录
- 一、归并排序
- 1.归并排序概念
- 2.例题讲解
- 二、堆排序
- 1.堆排序概念
- 2.堆排序的算法步骤
- 3.例题详解
一、归并排序
1.归并排序概念
归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治策略。
其分并过程
合并解读:
2.例题讲解
代码过程
#include<stdio.h>
void Merge(int a[], int start, int mid, int end,int c[])//将任意两个有序数组合并排序{int k = 0,i = start,j = mid + 1;while (i <= mid && j <= end) {if (a[i] < a[j]){c[k++] = a[i++];}else{c[k++] = a[j++];}}if (i == mid + 1) {while(j <= end)c[k++] = a[j++];}if (j == end + 1) {while (i <= mid)c[k++] = a[i++];}for (j = 0, i = start ; j < k; i++, j++) {a[i] = c[j];}
}void Merge_Sort(int a[], int start, int end,int c[])//将{if (start >= end)return;int mid = ( start + end ) / 2;//取中间的值,Merge_Sort(a, start, mid,c);Merge_Sort(a, mid + 1, end,c);Merge(a, start, mid, end,c);
}int main()
{int a[] = {7,0,5,4,1,3,2,6};int c[100];Merge_Sort(a, 0,8,c);for(int i=0;i<8;++i){printf("%d ",a[i]);}return 0;
}
结果演示:
二、堆排序
1.堆排序的概念
堆排序(Heapsort)是指利用堆积树这种数据结构所设计的一种排序算法。堆的两个的性质:
(1)堆中某个结点的值总是小于等于或大于等于其父结点的值;
(2)堆总是一棵完全二叉树.
在堆排序中将其分为两类:
(1)大顶堆:每个节点的值都大于或等于其子节点的值;
(2)小顶堆:每个节点的值都小于或等于其子节点的值。
用简单的公式表示为:
(1)大顶堆:a[i]>= a[2i+1] && a[i]>=a[2i+2]
(2)小顶堆:a[i]<= a[2i+1] && a[i]<=a[2i+2]
堆排序的平均时间复杂度为 Ο(nlogn)。
2.堆排序的算法步骤
先创建一个堆 H[0……n-1],再将堆首最大值(堆顶)和堆尾互换,此时的堆尾为最大值,然后将剩余的n-1个元素,再重新构造成一堆,重复上述操作,最后课得到一个有序序列。
3.例题详解
对数组a[ ]={8,9,2,1,0,3,16, 4, 7,10,13,12,15,5,14}进行排序,使其成为递增序列。
#include <stdio.h>
void swap(int *a, int *b) {int temp = *b;*b = *a;*a = temp;
}void MAX(int a[], int start, int end) {int child,parents;for(parents=start,child=2*parents+1;child<=end;parents=child,child=2*parents+1){ if (child + 1 <= end && a[child] < a[child + 1]) child++;if (a[parents] <a[child]){swap(&a[parents], &a[child]);} else { break; }}
}
void heap_sort(int a[], int n) {int i;for (i = n / 2 - 1; i >= 0; i--)MAX(a, i, n - 1);for (i = n- 1; i > 0; i--) {swap(&a[0], &a[i]);MAX(a, 0, i - 1);}
}
int main() {int a[] = {8,9,2,1,0,3,16, 4, 7,10,13,12,15,5,14};int N = (int) sizeof(a) / sizeof(*a);heap_sort(a, N);int i;for (i = 0; i < N; i++)printf("%d ", a[i]);printf("\n");return 0;
}
结果演示:
归并排序和堆排序讲解相关推荐
- 堆排序时间复杂度_leetcode刷题(二):排序算法(归并排序,堆排序,桶排序)...
今天,我们要来讲讲排序问题,这次讲的排序算法主要是归并排序,堆排序和桶排序. 归并排序 归并一词在中文的含义就是"合并,并入"的意思,在数据结构里面就是将两个或者两个以上的有序数组 ...
- 【Java】八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序 、快速排序、归并排序、堆排序和LST基数排序
这篇文章主要介绍了Java如何实现八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 .快速排序.归并排序.堆排序和LST基数排序,需要的朋友可以参考下 本文实现了八个常用的排序算法:插入排序 ...
- C语言——十四种内部排序算法【直接插入排序-冒泡排序-选择排序-插入排序-希尔排序-归并排序-快速排序-堆排序-折半插入排序-二分查找-路插入排序-表插入排序-简单选择排序-直接选择排序-树形选择】
目录: 一:插入排序 A:直接插入排序 1.定义: 2.算法演示 实例1: 3.基本思想 4.排序流程图 实例1: B:希尔排序 1.定义: 2.算法演示 实例2: C:其他插入排序 a:折半插入排序 ...
- 快速排序、希尔排序、插入排序、选择排序、归并排序、堆排序总结
一.快速排序的基本思想 设当前待排序的无序区为R[low..high],利用分治法可将快速排序的基本思想描述为: ①分解: 在R[low..high]中任选一个记录作为基准(Pivot ...
- 【转】排序算法复习(Java实现) (二): 归并排序,堆排序,桶式排序,基数排序...
http://www.blogjava.net/javacap/archive/2007/12/14/167618.html 六 归并排序 算法思想是每次把待排序列分成两部分,分别对这两部分递归地用归 ...
- python学习-综合练习七(二分查找(递归)、线性查找、插入排序、快速排序、选择排序、冒泡排序、归并排序、堆排序)-实例
文章目录 二分查找 线性查找 插入排序 快速排序 选择排序 冒泡排序 归并排序 堆排序 推荐代码一 推荐代码二 希尔排序 拓扑排序 说明:本篇博文的知识点大部分来自 Python3 实例 二分查找 二 ...
- 选择排序、冒泡排序、插入排序、快速排序、希尔排序、归并排序、堆排序和希尔排序的java实现比较
几种排序实现代码 package com.delicacy.oatmeal.test.suanfa.sort;import java.util.Arrays; import java.util.Ran ...
- 十大排序算法详解(二)归并排序、堆排序、计数排序、桶排序、基数排序
文章目录 一.归并排序 1.1 归并排序基础[必会知识] 1.1.1 递归实现 1.1.2 非递归实现 1.2 归并排序优化 1.2.1 小数组使用插入排序 1.2.2 避免多余比较 1.2.3 节省 ...
- 九大内部排序算法(快速排序、归并排序、堆排序、希尔排序、基数排序)
排序(Sorting)是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列. 文章目录 由于待排序的记录数量不同,使得排序过程中涉及的存储器 ...
最新文章
- Google Instant 瞬时搜索上手指南
- 2013 Multi-University Training Contest 5 部分解题报告
- 2021年春季学期-信号与系统-第十二次作业参考答案-第一小题
- 关于Advertising Campaign
- Spring 详解(四):Spring MVC
- crf linux使用教程,Linux下CRF++的使用
- 随记:Linux下LVM安装配置及使用
- 软件测试简历常见问题
- 多个485串联_让RS-485接口远离EMI风险!这有三个实用方案
- PCB天线设计及射频布局设计指南
- ActiveMQ--CVE-2015-5254
- 通过PS制作逼真的车窗玻璃雨滴效果
- syslinux 的EFI启动以及中文菜单
- 扩展卢卡斯 (板子)
- SSMS 18 安装过程中出现严重错误
- 【unity 保卫星城】--- 开发笔记03(飞机类第一版)
- Centos7下安装VScode
- 灰狼算法(GWO)优化长短期记忆神经网络的数据回归预测,GWO-LSTM回归预测,多输入单输出模型。
- gitbook安装使用看完这一篇就够了
- MapGis 二次开发 常见问题 转