C++学习(三十八)(C语言部分)之 排序(冒泡 选择 插入 快排)
算法是解决一类问题的方法
排序算法 根据元素大小关系排序 从小到大 从大到小
冒泡 选择 插入 快排
希尔排序 归并排序 堆排序
冒泡排序 从头到尾比较 每一轮将最大的数沉底 或者最小数字上浮
选择排序 1.找到最小/大的数字放到最前面 2.除过第一个数字以外,找到最小/大的数字与第二个元素对换 每一轮只交换一次数字
插入排序
假如 1 2 5 9 0
(1)现在1是有序的 选择5 和1比较,大了放1前面小了放1后面
后面的元素一个个插入到前面的队列中 插入保证有序
最后插入完成之后 这个元素的序列也是有序的
快速排序
一般排序 时间复杂度小 空间复杂度会较高
空间复杂度小 时间复杂度会高
时间 空间 用时间换空间 要么用空间换时间
--> 要么用时间换内存 要么用内存换时间
测试代码笔记如下:
- #include<stdio.h>
- //拆分出一个函数实现 1.排序的数组 2.数组中的元素格式确定排序次数---->参数
- //冒泡排序
- void bullet_sort(int*arr,int len) //或者 int*arr 是一样的 int len 是数组大小
- {
- int temp;
- printf("冒泡排序过程:\n");
- for (int i = ; i < len - ; ++i) //循环比较次数
- {
- //for (int j = 0; j < len - 1; ++j) //从头到尾比较一轮
- for (int j = ; j < len - -i; ++j) //代码优化 从头到尾比较一轮 每一轮都要少比较一个
- {
- if (arr[j]>arr[j + ]) //发现两个位置不对的与元素
- {
- //交换两个元素的位置
- temp = arr[j];
- arr[j] = arr[j + ];
- arr[j + ] = temp;
- }
- }
- //测试代码
- for (int j = ; j < len; ++j)
- {
- printf("%d\t", arr[j]);
- }
- printf("\n\n");
- }
- }
- //选择排序
- void select_sort(int arr[], int len)
- {
- int k,temp;
- printf("选择排序过程:\n");
- for (int i = ; i < len-; ++i) //先出arr[i]这个位置的元素
- {
- k = i; //保存这个位置的下标 作为初始条件
- for (int j = i + ; j<len;++j)
- {
- if (arr[k]>arr[j])
- {
- k = j; //arr[j]更小 用k保存位置
- }
- }
- //找完之后 arr[i] arr[k]最小 进行交换
- temp = arr[i];
- arr[i] = arr[k];
- arr[k] = temp;
- //测试代码
- for (int j = ; j < len; ++j)
- {
- printf("%d\t", arr[j]);
- }
- printf("\n\n");
- }
- }
- //插入排序
- void insert_sort(int arr[],int len)
- {
- int temp;
- printf("插入排序过程:\n");
- for (int i = ; i < len; ++i) //从第二个人开始插入
- {
- //先找合适的位置
- for (int j = ; j < i; ++j) //j<i是因为要比较i前面的元素
- {
- if (arr[j]>arr[i]) //找比arr[i]要大的第一个元素
- { //插入
- //将arr[i] 插入到arr[j]的位置
- temp = arr[i]; //保留要插入的数字
- for (int k = i - ; k >= j; --k)
- {
- arr[k + ] = arr[k];//往后移
- }
- arr[j] = temp;//插入元素
- break; //退出循环 不要再比较
- }
- }
- //插入完成 进行下一轮循环
- //测试代码
- for (int j = ; j < len; ++j)
- {
- printf("%d\t", arr[j]);
- }
- printf("\n\n");
- }
- }
- //快速排序
- int part(int arr[], int begin, int end)//将一个数组分成两个部分 有一个arr[k] 比arr[k]小的元素 全部在arr[k]左边 比arr[k]大的元素全部在arr[k]右边
- //返回这个k的值
- {
- //1.选中arr[begin]作数字
- int i = begin, j = end, temp;
- while (i < j)
- {
- //从右边找到一个比arrr[begin]小的元素
- while (i<j&&arr[j]>arr[begin]) --j;//找一个比arr[begin]要小的元素
- //从左边找到一个比arrr[begin]大的元素
- while (i<j&&arr[i] <= arr[begin]) ++i;
- temp = arr[i];
- arr[i] = arr[j];
- arr[j] = temp;//交换元素
- }
- //退出来的时候 i==j的 并且arr[i]这个位置 就是要找的k
- //arr[begin] 和arr[i]交换
- temp = arr[begin];
- arr[begin] = arr[i];
- arr[i] = temp;
- return i;
- }
- void quick_sort(int arr[], int begin, int end)
- {
- if (begin >= end) return;
- //begin必须小于end才需要排序
- //1.分成两个部分
- int k = part(arr, begin, end);//分成两个部分
- //arr[k]左边的元素全部小于arr[k] arr[k]右边元素全部大于arr[k]
- //2.排序左边
- quick_sort(arr, begin, k - );//k的位置不参与排序 所以是k-1
- //3.排序右边
- quick_sort(arr, k + , end);
- }
- int main()
- {
- //定义乱序数组并原样输出
- int arr[] = {,,,,,,,,,}; //乱序数组
- printf("排序前输出:");
- for (int i = ; i < ; ++i) //打印出数组中的元素
- {
- printf("%d\t", arr[i]);
- }
- printf("\n\n");
- //冒泡排序
- // bullet_sort(arr, 10); //调用函数 参数值是数组名以及数组大小
- //选择排序
- // select_sort(arr, 10);
- //快速排序
- quick_sort(arr, , );
- //int temp;
- //for (int i = 0; i < 9; ++i) //排序九轮
- //{
- // for (int j = 0; j < 9; ++j) //从头到尾比较
- // {
- // if (arr[j] > arr[j + 1]) //比较 >是从小到大 <是从大到小 j+1<10 -----> j<9
- // {
- // //交换两个元素的位置
- // temp = arr[j];
- // arr[j] = arr[j + 1];
- // arr[j + 1] = temp;
- // }
- // }
- //}
- //输出排序
- printf("排序后输出:");
- for (int i = ; i < ; ++i)
- {
- printf("%d\t", arr[i]);
- }
- getchar();
- return ;
- }
2019-04-02 17:35:13
C++学习(三十八)(C语言部分)之 排序(冒泡 选择 插入 快排)的更多相关文章
- 前端学习(三十八)vue(笔记)
Angular+Vue+React Vue性能最好,Vue最轻=======================================================Angular ...
- Salesforce LWC学习(三十八) lwc下如何更新超过1万的数据
背景: 今天项目组小伙伴问了一个问题,如果更新数据超过1万条的情况下,有什么好的方式来实现呢?我们都知道一个transaction只能做10000条DML数据操作,那客户的操作的数据就是超过10000 ...
- Java进阶(三十八)快速排序
Java进阶(三十八)快速排序 前言 有没有既不浪费空间又可以快一点的排序算法呢?那就是"快速排序"啦!光听这个名字是不是就觉得很高端呢. 假设我们现在对"6 1 2 7 ...
- python3.4学习笔记(十八) pycharm 安装使用、注册码、显示行号和字体大小等常用设置
python3.4学习笔记(十八) pycharm 安装使用.注册码.显示行号和字体大小等常用设置Download JetBrains Python IDE :: PyCharmhttp://www. ...
- 学习笔记:CentOS7学习之十八:Linux系统启动原理及故障排除
目录 学习笔记:CentOS7学习之十八:Linux系统启动原理及故障排除 18.1 centos6系统启动过程及相关配置文件 18.1.1 centos6系统启动过程 18.1.2 centos6启 ...
- Java开发学习(三十六)----SpringBoot三种配置文件解析
一. 配置文件格式 我们现在启动服务器默认的端口号是 8080,访问路径可以书写为 http://localhost:8080/books/1 在线上环境我们还是希望将端口号改为 80,这样在访问的时 ...
- NeHe OpenGL教程 第三十八课:资源文件
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- SQL注入之Sqli-labs系列第三十八关、第三十九关,第四十关(堆叠注入)
0x1 堆叠注入讲解 (1)前言 国内有的称为堆查询注入,也有称之为堆叠注入.个人认为称之为堆叠注入更为准确.堆叠注入为攻击者提供了很多的攻击手段,通过添加一个新 的查询或者终止查询,可以达到修改数据 ...
- 微信小程序把玩(三十八)获取设备信息 API
原文:微信小程序把玩(三十八)获取设备信息 API 获取设备信息这里分为四种, 主要属性: 网络信息wx.getNetWorkType, 系统信息wx.getSystemInfo, 重力感应数据wx. ...
随机推荐
- JDK的安装与测试
一,下载并安装JDK1.8版本以上 1.Oracle官网下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downl ...
- 智能合约遇到的小错误 network up to date解决办法
https://blog.csdn.net/qindong564950620/article/details/68933678 说 network up to date .这个错误我刚开始不知道怎么解 ...
- 当后台获取内容有标签时如何过滤---angular
$sce controller中注入$sce服务; 假设将获取到的标签内容为result; $scope.result = $sce.trustAsHtml(result); 在html页面中则< ...
- [译] 关于 Angular 依赖注入你需要知道的
如果你之前没有深入了解 Angular 依赖注入系统,那你现在可能认为 Angular 程序内的根注入器包含所有合并的服务提供商,每一个组件都有它自己的注入器,延迟加载模块有它自己的注入器. 但是,仅 ...
- OpenStack笔记
*********virsh xml文件解读****************************** https://libvirt.org/format.html https://libvirt ...
- HDU - 1061-快速幂签到题
快速幂百度百科:快速幂就是快速算底数的n次幂.其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高. HDU - 1061 代码实现如下: import java.util.Sc ...
- STL标准库-容器-deque 双端队列
头文件: #include<deque> 常用操作: https://www.cnblogs.com/LearningTheLoad/p/7450948.html
- 小程序 input 组件内容显示不全(显示的长度不满 input 宽度)问题
问题:小程序的input组件经常用到,但在使用input组件的时候会出现一种现象:明明设置了input的宽度,但是输入的内容显示的长度范围却怎么都不到一整个input组件的宽度,而且后面没显示的地方无 ...
- 牛客网第4场A
链接:https://www.nowcoder.com/acm/contest/142/A 来源:牛客网 题目描述 A ternary , , or . Chiaki has a ternary in ...
- Python3+SQLAlchemy不使用字段名获取主键值教程
一.说明 1.1 环境说明 user model如下,且其现有一个实例user_inst: class User(Base): __tablename__ = 'users' username = C ...