手撕七大排序 (二)
手撕七大排序 (二)
- 交换排序
- 一. 冒泡排序
- 1. 单趟冒泡排序
- 2. 多趟排序
- 二. 快速排序
- 选择排序
- 一. 选择排序
- 1. 单趟选择排序
- 2. 完整选择排序
- 二. 堆排序
交换排序
一. 冒泡排序
现在我们给大家一个无序数组 要求是我们要将最大的数字放到数组最后面去
这个时候大家应该是怎么想的呢?
- 我们可以遍历一遍数组然后找到一个最大的值 放到最后去 (这个我们待会儿讲)
- 我们将这个数字和后面的数字进行比较 如果前面的数字比较大 就交换它们 如果不大于 就比较下面的数字和后面的数字 这样比较一趟 最大的数字就到最后面了
我们首先来谢谢单趟冒泡排序的代码
1. 单趟冒泡排序
也就是将一个数字放到最后的冒泡排序
代码表示如下
void Bubblesort1(int* arr, int size)
{// assertassert(arr);// 将最大的数字放到最后面int i = 0;int tmp = 0;for ( i = 0; i < size - 1; i++){// 比较大小if (arr[i]>arr[i+1]){tmp = arr[i];arr[i] = arr[i + 1];arr[i + 1] = tmp;}}
}
我们来看看结果
我们发现可以完美运行
2. 多趟排序
我们想想看 既然每次排序能够将最大的数字放到最后去
我们是不是可以在经过(x-1)次排序之后将x个数字排序完成啊
既然如此 我们开始实现完全体的冒泡排序
代码表示如下
void Bubblesort(int* arr, int size)
{// assertassert(arr);// i表示躺数 j表示每一趟排序需要做的事情 tmp临时变量int i = 0;int j = 0;int tmp = 0;for ( i = 0; i < size-1; i++){for ( j = 0; j < size - 1 - i; j++){if (arr[j] > arr[j + 1]){// 比较if (arr[j]>arr[j+1]){tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}}
}
还是一样我们来看看效果怎么样
可以完美运行
二. 快速排序
这个排序很难 并且会有很多变形
所以我会用单独的一篇博客来介绍
介绍完之后会将连接贴到这篇博客里面
选择排序
一. 选择排序
1. 单趟选择排序
还记不记得我们上面讲的一句话
我们这里设定只要设定一个最大值 依次遍历整个数组 并且在最后将这个最大值放到数字后面就可以
代码表示如下
void selectionsort1(int* arr, int size)
{// assertassert(arr);// 设定一个最大值(下标) 遍历整个数组找到最大的int maxi = 0;int i = 0;for ( i = 0; i < size; i++){if (arr[i] > arr[maxi]){maxi = i;}}// 最后交换位置int tmp = 0;tmp = arr[maxi];arr[maxi] = arr[size - 1];arr[size - 1] = tmp;
}
2. 完整选择排序
跟冒泡排序的思想及其相似
使用i控制排序的次数
使用j来控制每次排序
整体代码如下
void selectionsort(int* arr, int size)
{// assertassert(arr);// 还是一样 i控制多少次 j控制每一次的选择排序int i = 0;int j = 0;int maxi = 0;int tmp = 0;for ( i = 0; i < size-1; i++){for (j = 0; j < size - 1 - i; j++){if (arr[j]>arr[maxi]){maxi = j;}}tmp = arr[size - 1 - i];arr[size - 1 - i] = arr[maxi];arr[maxi] = tmp;}}
二. 堆排序
堆排序已经在前面的博客中介绍了
大家可以参考下我的这篇博客
堆排序
手撕七大排序 (二)相关推荐
- 万字手撕七大排序(代码+动图演示)
万字拿捏七大排序 1.排序的概念及其运用 1.1排序的概念 1.2 排序的运用 1.3 常见的排序算法 2. 常见排序算法的实现 2.1 插入排序 2.1.1 基本思想 2.1.2直接插入排序 2.1 ...
- LeetCode912. 排序数组(JavaScript手撕各种排序算法)
题目链接:https://leetcode-cn.com/problems/sort-an-array/submissions/ 这是一道好题目,可以用来练习手撕各种排序算法,别直接调用api错过了这 ...
- [ 数据结构 -- 手撕排序算法第四篇 ] 选择排序
手撕排序算法系列之第四篇:选择排序. 从本篇文章开始,我会介绍并分析常见的几种排序,大致包括直接插入排序,冒泡排序,希尔排序,选择排序,堆排序,快速排序,归并排序等. 大家可以点击此链接阅读其他排序算 ...
- [ 数据结构 -- 手撕排序算法第三篇 ] 希尔排序
手撕排序算法系列之:希尔排序. 从本篇文章开始,我会介绍并分析常见的几种排序,大致包括插入排序,冒泡排序,希尔排序,选择排序,堆排序,快速排序,归并排序等. 大家可以点击此链接阅读其他排序算法:排序算 ...
- 手撕python_GitHub - caishiqing/manual: 手撕机器学习
手撕机器学习 用腻了开源框架,尝试下手撕机器学习模型?写这个手撕机器学习系列,旨在不使用任何开源框架的条件下手推实现各种模型,同时保证高性能. Requirements 适用于python2.7与py ...
- 手撕代码之七大常用排序算法 | 附完整代码
点击上方↑↑↑蓝字关注我们~ 「2019 Python开发者日」全日程揭晓,请扫码咨询 ↑↑↑ 0.导语 本节为手撕代码系列之第一弹,主要来手撕排序算法,主要包括以下几大排序算法: 直接插入排序 冒泡 ...
- 面试官:手撕十大排序算法,你会几种?
作者: C you again,从事软件开发 努力在IT搬砖路上的技术小白 公众号: [C you again],分享计算机类毕业设计源码.IT技术文章.游戏源码.网页模板.程序人生等等.公众号回复 ...
- 七大排序的个人总结(二) 归并排序(Merge
七大排序的个人总结(二) 归并排序(Merge 归并排序(Merge Sort): 归并排序是一个相当"稳定"的算法对于其它排序算法,比如希尔排序,快速排序和堆排序而言,这些算法 ...
- 详解面试手撕过的那些排序算法
前言 只要去大厂面试,必定有一轮算法面试,而这一轮往往是阻碍程序员面试成功的关键.一个程序员的算法基本功是否扎实能够体现出自身的开发能力,下面我尽可能的把常用的排序算法讲清楚. 排序简介 排序(Sor ...
最新文章
- 浅析cookie以及一些小案例
- Android开发之Glide设置View背景图的方法
- 小程序支付成功后跳转页面失败
- FreeEIM V 2.8.9.8 改善计划
- Kylin兼容性问题解决
- ROS-Academy-for-Beginners 替换自己的地图模型
- 20145233《网络对抗》Exp6 信息收集和漏洞扫描
- 数据库可视化软件:Navicat系列
- Android开机动画没有声音,Android O 8.0 自定义开机动画/开机铃声
- 电脑计算机程序员考证
- kali更新grub修复双系统windows10引导启动项
- 软件测试周刊(第32期):沙漠中藏着一口井
- 华为鸿蒙11公测版,首升鸿蒙2.0系统!华为官宣这10款机型率先公测EMUI11-互联网/电商-文章-小虾米...
- U8结账提示出纳系统结账后账务系统才可以结账处理方法
- Swift开发 UIColor分类Hex颜色转换
- PDF分割成两页怎么弄?来看看这3个工具
- 【Java】import org.junit.Test 和@Test报错
- 网站搭建:从0到1搭建网站
- 数据结构:大学的数据统计
- MSP430-USC(二)
热门文章
- Linux串口通信之termios结构体
- 台式计算机能装蓝牙吗,台式机安装蓝牙方法推荐
- 浙江凤凰计划:用新零售模式做资本市场敲门砖
- mac清空废纸篓怎么恢复?
- 融云钜惠来袭,新客尝鲜首月 2.7 折起,超值套餐 6 折起
- java学习--基础知识进阶第七天--HashSet集合、HashMap集合(集合遍历)
- 在家月入5q+有手机就能赚米,推荐14个让你在家就能挣米的软件
- 【Android SDM660源码分析】- 03 - UEFI XBL GraphicsOutput BMP图片显示流程
- PCA主成分分析(原理+例子)
- 用项目管理思维做一个活动策划