当前位置: 首页 > news >正文

快速排序+归并排序代码回顾

快速排序与归并排序简介: 

quick_sort为快速排序,merge_sort为归并排序,两者基于分治的思想;

快速排序,简称快排,它以原来数组中的一个值(我们记为x)作为界限,将比它小的元素放到x的左边,大于x的放到x的右边,一遍之后,x就放到了它应该放到的位置,然后对x左侧的子数组做快排,同理,对于x右侧的子数组继续做快排即可;

归并排序,是将数组的中点作为界限,将处于前50%的值放在左一半,将大小处于后50%的值放在右一半。不考虑顺序。一轮过去,我们继续对数组前半边使用归并排序,同理,对于数组右半边使用归并排序。值得注意的是,归并排序一直这样递归下去,数组将不断被分割为大小为1的单个元素数组。前面我们并没有考虑顺序,现在我们使用一个tmp数组,对于两个已经被切割的子数组中的元素进行排序。对于原来两个数组各自使用一个指针从头到尾遍历,谁小谁就放在tmp数组中,遍历完成之后,如果有一个数组没有遍历完,那说明它的值相对于另一个数组来说值较大,我们直接拷贝到tmp数组中即可。这样tmp数组放的肯定就是已经排好序的元素,我们应该把他放到原数组中去,让它参与下一轮比较。

代码一览:

#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<assert.h>
using namespace std;void Swap(int* pa, int* pb) {int temp = *pa;*pa = *pb;*pb = temp;
}
void quick_sort(int q[], int l,int r) {if(l >= r)return;int i = l - 1, j = r + 1;int x = q[(l + r) / 2];while (i < j) {do i++; while (q[i] < x);do j--; while (q[j] > x);if (i < j)Swap(&q[i], &q[j]);}quick_sort(q, l, j), quick_sort(q, j+1,r);//不要把这个忘记了!是j而不是i,如果是后者,模板得换;
}
int tmp[100];
void merge_sort(int q[], int l, int r) {if (l >= r)return;int mid = (l + r) / 2;merge_sort(q, l, mid), merge_sort(q, mid + 1, r);int i = l, j = mid + 1;int k = 0;while (i <= mid && j <= r) {if (q[i] < q[j])tmp[k++] = q[i++];else tmp[k++] = q[j++];}while (i <= mid) {tmp[k++] = q[i++];}while (j <= r) {tmp[k++] = q[j++];}for (k = 0, i = l; i <= r; k++,i++) {q[i] = tmp[k];}
}
int main() {int arr[] = { 95,1,45,45,454,5,45,62,64,87,84,36,16,1 };int arr2[] = { 95,1,45,45,454,5,45,62,64,87,84,36,16,1 };int len = sizeof(arr) / sizeof(arr[0]);quick_sort(arr, 0, len - 1);merge_sort(arr2, 0, len - 1);for (int i = 0; i < len; i++) {printf("%d ", arr[i]);}puts("");for (int i = 0; i < len; i++) {printf("%d ", arr2[i]);}puts("");return 0;
}

为了保证随机性,我们亦可以在main函数中使用随机数来初始化数组,其他不变:

int main(){int p[10],q[10];srand(time(NULL));for (int i = 0; i < 10; i++) {p[i] = rand() % 999 + 1;q[i] = rand() % 9999 + 1;}for (int i = 0; i < 10; i++) {printf("%d ", p[i]);}puts("");for (int i = 0; i < 10; i++) {printf("%d ", q[i]);}puts("");quick_sort(p, 0, 9);merge_sort(q, 0, 9);puts("");for (int i = 0; i < 10; i++) {printf("%d ", p[i]);}puts("");for (int i = 0; i < 10; i++) {printf("%d ", q[i]);}puts("");return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • java实操(二)-酒店管理系统
  • python的sqlalchemy使用@contextmanager来定义上下文管理器
  • MySQL进阶篇4 - 锁
  • mysql学习教程,从入门到精通,MySQL 删除数据库教程(6)
  • [快速入门] 使用 MybatisPlus 简化 CRUD 操作
  • 动手学深度学习(pytorch)学习记录26-卷积神经网路(LeNet)[学习记录]
  • Python操作ES集群API(增删改查等)
  • 民生水暖工程背后的科技力量引领工程智能化转型
  • 使用FastJson2将对象转成JSON字符串时,小数转换出错
  • RedissonClient 分布式队列工具类
  • 智能客服的演变:从传统到向量数据库的新时代
  • [iBOT] Image BERT Pre-Training with Online Tokenizer
  • springboot高校实验室预约系统-计算机毕业设计源码58031
  • 无需温度修正,测值准确可靠 GEO ACxxxx型振弦式锚索测力计
  • 机器学习特征分析
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • es6
  • es6(二):字符串的扩展
  • October CMS - 快速入门 9 Images And Galleries
  • Odoo domain写法及运用
  • php中curl和soap方式请求服务超时问题
  • tab.js分享及浏览器兼容性问题汇总
  • Terraform入门 - 1. 安装Terraform
  • Web Storage相关
  • Web标准制定过程
  • - 概述 - 《设计模式(极简c++版)》
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 前端面试之闭包
  • 前端知识点整理(待续)
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 说说我为什么看好Spring Cloud Alibaba
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #1015 : KMP算法
  • $(function(){})与(function($){....})(jQuery)的区别
  • (C++哈希表01)
  • (C语言)字符分类函数
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (八)Flink Join 连接
  • (补)B+树一些思想
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (三)Honghu Cloud云架构一定时调度平台
  • (三十)Flask之wtforms库【剖析源码上篇】
  • (十六)视图变换 正交投影 透视投影
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (一)Thymeleaf用法——Thymeleaf简介