C语言实现快速排序与归并排序

2023-11-11

快排
代码如下:

#include<stdio.h>
void swap(int a,int b);
int partion(int a[],int l,int r);
void quicksort(int a[],int l,int r);
int main()
{
	int a[]={3,3,5,6,0,1,7,9,13,4,55};
	quicksort(a,0,10);
	for(int i=0;i<sizeof(a)/sizeof(int);i++)
		printf("%d ",a[i]);
	printf("\n");
	return 0;
}
void swap(int &a,int &b)
{
	int temp;
	temp=a;
	a=b;
	b=temp;
}
int partion(int a[],int left,int right)
{
	if(l<=r)
	{
		int i=left,j=right+1;
		do{
			do i++; while(a[i]<a[left]);
			do j--; while(a[j]>a[left]);
			if (i<j)swap(i,j);
		}while(i<j);
		swap(left,j);
		return j;
	}
}
void quicksort(int a[],int left,int right)
{
	int j;
	if(left<ri)
	{
		 j=partion(a,l,r);
		quicksort(a,l,j-1);
		quicksort(a,j,r);
	}
}

归并排序:

#include<stdio.h>
void mergesort(int a[],int left,int right);
void merge(int a[],int left,int mid, int right);
int main()
{
	int a[]={3,3,5,6,0,1,7,9,13,4,55};
	mergesort(a,0,10);
	for(int i=0;i<sizeof(a)/sizeof(int);i++)
		printf("%d ",a[i]);
	printf("\n");
	return 0;
}
void merge(int a[],int left,int mid, int right)
{
	int* temp = new int[right-left+1];
	int i=left,j=mid+1,k=0;
	while((i<=mid)&&(j<=right))
		if(a[i]<=a[j]) temp[k++]=a[i++];
		else temp[k++]=a[j++];
	while(i<=mid) temp[k++]=a[i++];
	while(j<=right) temp[k++]=a[j++];
	//for(i=0,k=left;k<=right;)
	//	a[k++]=temp[i++];
	for(i=0;i<k;i++)
		a[left+i]=temp[i];
}
void mergesort(int a[],int left,int right)
{
	if(left<right){
		int mid=(left+right)/2;
		mergesort(a,left, mid);
		mergesort(a, mid+1, right);
		merge(a,left,mid,right);
	}
}


快速排序在一趟排序中将数字分割成为独立的两部分,左边一部分小于轴值,右边一部分大于轴值,轴值的选择理论上可以选择数组中的任何一个数组,我们在这里考虑选择第一个数字。然后对两部分序列重复进行上述操作,快速排序可以用递归来完成。

时间复杂度:最好情况O(nlogn)——Partition函数每次恰好能均分序列,其递归树的深度就为.log2n.+1(.x.表示不大于x的最大整数),即仅需递归log2n次; 最坏情况O(n^2),每次划分只能将序列分为一个元素与其他元素两部分,这时的快速排序退化为冒泡排序,如果用数画出来,得到的将会是一棵单斜树,也就是说所有所有的节点只有左(右)节点的树;平均时间复杂度O(nlogn)

1》归并排序的步骤如下:
Divide: 把长度为n的输入序列分成两个长度为n/2的子序列。
Conquer: 对这两个子序列分别采用归并排序。
Combine: 将两个排序好的子序列合并成一个最终的排序序列。

2》时间复杂度:
这是一个递推公式(Recurrence),我们需要消去等号右侧的T(n),把T(n)写成n的函数。其实符合一定条件的Recurrence的展开有数学公式可以套,这里我们略去严格的数学证明,只是从直观上看一下这个递推公式的结果。当n=1时可以设T(1)=c1,当n>1时可以设T(n)=2T(n/2)+c2n,我们取c1和c2中较大的一个设为c,把原来的公式改为:
这样计算出的结果应该是T(n)的上界。下面我们把T(n/2)展开成2T(n/4)+cn/2(下图中的©),然后再把T(n/4)进一步展开,直到最后全部变成T(1)=c(下图中的(d)):
把图(d)中所有的项加起来就是总的执行时间。这是一个树状结构,每一层的和都是cn,共有lgn+1层,因此总的执行时间是cnlgn+cn,相比nlgn来说,cn项可以忽略,因此T(n)的上界是Θ(nlgn)。
如果先前取c1和c2中较小的一个设为c,计算出的结果应该是T(n)的下界,然而推导过程一样,结果也是Θ(nlgn)。既然T(n)的上下界都是Θ(nlgn),显然T(n)就是Θ(nlgn)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言实现快速排序与归并排序 的相关文章

  • C#中结构体排序方法(Array.sort() + ICompare)

    感觉C 比C 麻烦许多 资料也少 找了半天竟然没有找到一个能用的结构体排序 这是待排序的结构体 public struct la public int id public int sb 首先 C 需要调用一个空间 类似头文件 using S
  • CC++ qsort函数和sort函数

    qsort 函数和 sort 函数实现排序功能 前者是 C 语言内容 后者是 C 内容 下面逐一讲解 qsort 先来看一个对数组 arr 排序的例子 qsort 函数在 stdlib h 库中 使用时要包含该库文件 include
  • 选择排序——堆排序

    一 堆排序的相关概念 1 堆的定义 从堆的定义可以看出 堆实质是满足如下性质的完全二叉树 二叉树中任一非叶子结点均小于 大于 它的孩子结点 2 堆排序的定义 若在输出堆顶的最小值 最大值 后 使得剩余n 1个元素的序列重又建成一个堆 则得到
  • 排序算法浅识

    排序说简单也简单 说复杂某些地方也是有些绕 这里做做笔记 帮助自己记忆和理解常接触的排序算法到底是什么鬼 什么是排序 其实就是排大小啊大佬 排序的稳定性 为何排序的稳定性很重要 在初学排序时会觉得稳定性有这么重要吗 两个一样的元素的顺序有这
  • 基数排序-------C语言实现

    其他排序 堆排序 归并排序 插入排序和希尔排序 快速排序 冒泡排序和选择排序 基数排序 前备知识 注 我们知道 对于一个数如果我们想获取它得个位 只需对10取余 想获取十位的数 可以除10然后再对10取余 获取百位除100然后再对10取余
  • C语言--库函数qsort排序

    文章目录 一 C语言 库函数qsort排序 1 1 冒泡排序 1 2 qsort排序 二 模拟实现qsort函数 一 C语言 库函数qsort排序 假设我们要对一个数组元素进行排序 如果是一个整型数组 我们首先可以想到的是冒泡排序 但其实C
  • Python实现选择排序

    选择排序简介 选择排序 Selection sort 是一种简单直观的排序算法 简单来说就是从无序队列里面挑选最小的元素 和无序队列头部元素替换 放到有序队列中 最终全部元素形成一个有序的队列 选择排序原理 首先在未排序序列中找到最小 大
  • 【TreeMap】-根据 key 或 value 排序

    1 根据 key 排序 引言 TreeMap 中key 可以自动对 String 类型或8大基本类型的包装类型进行排序 但是 TreeMap 无法直接对自定义类型进行排序 当我们想对对 TreeMap 中 key 中的自定义类型排序时 必须
  • CH8-排序

    文章目录 1 基本概念和排序方法概述 1 1 排序方法的分类 1 2 存储结构 顺序表 2 插入排序 2 1 插入排序的种类 直接插入 折半插入 希尔排序 3 交换排序 3 1 冒泡排序 3 2 快速排序 4 选择排序 4 1 直接排序 4
  • 力扣每日一题——最大间距

    题目链接 class Solution public int maximumGap vector
  • 为什么软件开发很难?真相了

    为什么软件开发很难 真相了 作者 Jeremy Mikkol 本文认为这种困难与编程语言无关 因为现代的编程语言已经足够好了 那么 原因到底是什么 有一种观点认为 使用更好的编程语言就会让软件开发变得更容易 更高效 在汇编或 Fortran
  • 经典的8个内部排序算法

    1 直插排序 思想 每一趟 对于待排序元素a i 该元素前面的子序列已有序 在有序序列中从后往前查找其插入位置 一边比较一边移动 直至找到插入位置 插入该元素 一共n 1趟 举例 待排序序列 5 8 4 12 9 第一趟 5 8 4 12
  • 对所有数据类型可通用的快速排序算法

    1 引子 快速排序算法可能是最优秀的排序算法了 此算法是1960年C A Hoare发明出来的 它被列为20世纪十大算法之一 快速排序也属于广义上的冒泡排序 这是简单冒泡排序法的优化升级 两者都是通过比较大小 交换元素来排序的 不过它增大了
  • 数据结构中内部排序的各种比较

    排序算法中的稳定和不稳定指的是什么 若在待排序的纪录中 存在两个或两个以上的关键码值相等的纪录 经排序后这些记录的相对次序仍然保持不变 则称相应的排序方法是稳定的方法 否则是不稳定的方法 内部排序和外部排序 根据排序过程中涉及的存储器不同
  • C语言实现快速排序与归并排序

    快排 代码如下 include
  • 力扣算法合集

    algo 鸡汤篇 排序算法 二叉树 哈希表 栈和队列 数组 链表 字符串 算法套路 双指针 排序 贪心思想 二分查找 搜索 动态规划 斐波那契数列 矩阵路径 数组区间 分割整数 最长递增子序列 01背包 股票交易 字符串编辑 算法题解 动态
  • 冒泡排序--数组的简单排序,从大到小,从小到大

    冒泡排序 是计算机程序中较为常见和简单的排序算法 它需要重复地走访需要进行排序的元素列 按照一定顺序依次比较两个相邻的元素 如果顺序错误就把他们交换过来 示意原图如下 我们需要的结果示意图如下 那我们应该怎么进行程序的编写才能满足这样的结果
  • Java常见排序:(三)快速排序

    快速排序是一种非常快的交换排序方法 思路很简单 将待排的数据序列中任意取一个数据作为分界值 所有比这个值小的放在左边 比他大的放在右边 形成左右两个子序列 左边的值都比分界值小 右边的值都比分界大 接下来对左右两个子序列进行递归 两个子序列
  • Java 中Arrays工具类的使用

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到网站 介绍 java util Arrays类即为操作数组的工具类 包含了用来操作数组 比如排序和搜索 的各种算法 下面我用代码给大家演示一下
  • js 对数组对象进行排序

    let listData id 1 name 测试1 presenttime 1557883600000 id 2 name 测试2 presenttime 1580751813000 id 3 presenttime 1561448381

随机推荐

  • 解析http中的xml, 同时返回xml文件

    需要先导入架包 这是一个解析request中xml SuppressWarnings rawtypes private HashMap
  • 【基于 GitLab 的 CI/CD 实践】01、GitLab CI/CD 基础概念

    目录 一 为什么要做 CI CD 1 1 背景 传统的应用开发发布模式 问题 1 2 持续集成与持续交付 持续集成 CI 持续交付 CD 持续部署 CD 1 3 CI CD 的价值体现 1 4 推荐常用的 CI CD 工具 Jenkins
  • 把自己的博客推荐到百度、Google等主要搜索引擎

    谷歌搜索自己的博客 搜索不到 可以設置公開 添加記錄 會比較方便 如果不把你的博客提交到各大搜索引擎中 它们一般是不会收录你的博客的 你可以先尝试一下看看能不能在百度搜到你的博客吧 如果搜不到的话说明你的博客还没有被百度收录 那么怎么才能被
  • Azkaban

    文章目录 前言 一 Azkaban是什么 二 Azkaban与其他的工作流调度系统 1 简单的任务调度系统 2 复杂的任务调度 三 Azkaban架构 四 Azkaban配置 basic flow 基础配置 basic flow条件工作流
  • mysql对表的基本操作

    文章目录 mysql表的基本操作 删除操作drop 修改基本表alter 基本练习 对表的基本操作 DML DQL 增加数据 修改数据 删除数据 查询数据 练习 mysql表的基本操作 删除操作drop 删除数据库 DROP DATABAS
  • 【C语言】C语言中容易忽略的知识点与技巧---2

    我来填坑啦 不好看的目录 前言 一 单目运算符 二 输出转换 语句 总结 前言 上次的C语言总复习第二集 一 单目运算符 对读取的整数值进行符号取反操作并输出结果 include
  • win10下自动化任务,5步快速实现

    大家好 我是小一 前面写过一篇 Linux 下的自动化任务设置 但是发现更多朋友办公用的都是 Windows 系统 所以这篇就来说说如何在win下设置自动化任务 下面是以 win10 系统为例 当然在 win7 系统也同样适用 今天要用到的
  • easyui combtree 单选的时候实现 再次点击取消选中

    easyui combtree 单选的时候实现 再次点击取消选中 原理 就是在 select 的时候判断当前节点是否选中 选中了的话就通过改变 节点 的class 属性来取消选中 并且清空combotree 的值 同时 return fal
  • 你知道Python基础包含哪些内容?学习什么吗?

    Python基础包含哪些内容 学习什么 学习Python基础了解Python语言起源 设计目标 设计哲学 Python语言的优缺点和面向对象的基本概念 执行方式 集成开发环境PyCharm的使用为Python的深入学习做铺垫 接下来小编就介
  • ajax全选功能,jq checkbox 的全选并ajax传参的实例

    Box prop checked true else checkBox removeAttr checked form on click ids function var chknum input name ids checkBox siz
  • Convolutional Networks(3)

    CONTENTS Random or Unsupervised Features Typically the most expensive part of convolutional network training is learning
  • usart和uart的主要区别

    USART 通用同步和异步收发器UART 通用异步收发器 当进行异步通信时 这两者是没有区别的 区别在于USART比UART多了同步通信功能 这个同步通信功能可以把USART当做SPI来用 比如用USART来驱动SPI设备 同步是指 发送方
  • BMP转JPG(法一)使用jpeglib库实现bmp转jpg

    一 vc编译jpeglib库 1 下载源代码 下载地址 http www ijg org 注意 一定要下载win32 版本 2 编译源代码 A 解压源代码 修改源代码中jconfig vc为jconfig h B 添加环境变量PATH C
  • 微信卡券 java_微信小程序领取卡券(java)

    最近做了个领取微信卡券的小程序 看了很多文档资料以及花了很多时间才算搞定的 不过也算是好事多磨 这边记录分享一下 也算给一点提升 一 开发前准备 1 申请微信公众号 和 微信小程序 这是两个不同的东西 都需要单独申请 不同的帐号 2 微信公
  • swiper-item @touchmove.stop false不好用

    我理解你的问题是说你在使用 Vue js 框架中的 swiper item 组件时 你想禁止它的 touchmove 事件 但是 touchmove stop 这个修饰符却不起作用 首先 touchmove stop 这个修饰符是用来阻止浏
  • 【编译原理】LALR(1)语法分析方法(c++实现)

    前文回顾 编译原理 LR 0 分析方法 c 实现 编译原理 SLR 1 分析方法 c 实现 编译原理 LR 1 分析方法 c 实现 这几个程序的代码大部分是一样的 根据不同算法特点做了部分修改而已 代码 LALR 1 的代码就是在LR 1
  • 元宇宙通证-七、元宇宙外:千行万业的元宇宙化

    七 元宇宙外 千行万业的元宇宙化 元宇宙将会赋能所有行业 激发传统行业的发展新动能 实现行业高质量发展 千行万业的元宇宙化 其中最重要的是经济体系 沉浸感 社交关系的代入 一方面 元宇宙将会赋能现实世界的所有行业领域 基于现有商业模式进行元
  • CTF加密解密—CRYPTO—crypto8

    0x00 考察知识点 这道题和上道Ook的题目同源 直接通过Ook底层的解码进行解码 因为Ook本身就是在brainfuck的基础上完成的 0x01 题目 gt lt gt lt gt lt gt lt gt lt gt lt gt lt
  • Ubuntu系统下《汇编语言》环境配置

    说明 1 系统 Ubuntu codists pc lsb release a No LSB modules are available Distributor ID Ubuntu Description Ubuntu 21 10 Rele
  • C语言实现快速排序与归并排序

    快排 代码如下 include