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. ...
随机推荐
- (转载)Unity UGUI点击不同Button执行不同的方法(无参方法)
将脚本随意挂在任何位置 但是这个btnParent一定是 按钮的父节点 脚本很简单自己敲一遍就全都明白了 上脚本 OnClickTest using UnityEngine; using Un ...
- POJ2955--Brackets 区间DP入门 括号匹配
题意很简单,就是求给出串中最大的括号匹配数目.基础题,格式基本为简单区间dp模板. #include<iostream> #include<string.h> using na ...
- 阿里技术专家详解Dubbo实践,演进及未来规划
https://mp.weixin.qq.com/s/9rVGHYfeE8yM2qkSVd2yEQ
- robot framework学习五——AutoltLibrary库
安装中遇到的问题: 安装好了AutoItLibrary,但是导入到RIDE后,仍然红色显示 搜索了下解决办法,说要安装下autoit-v3-setup.exe https://www.autoitsc ...
- Entity Framework框架 (二)
一.前面一篇EF的介绍主要是通过linq语句,本篇主要是介绍一下不通过linq语句如何去操作EF执行查询sql语句与执行存储过程. 1. 其中的Acccout是输出参数对应的类.比如输出参数有三个值 ...
- [C#]统计文本文件txt中的行数(快速读取)
快速统计文本文件中的行数( StreamReader.ReadLine() ): 测试代码如下: //读取txt文件中总行数的方法 public static int requestMethod(St ...
- 【分布式搜索引擎】Elasticsearch分布式架构原理
一.相关概念介绍 1)集群(cluster) 一个集群(cluster)由一个或多个节点组成. 这些节点具有相同的cluster.name,它们协同工作,分享数据和负载.当加入新的节点或者删除一个节点 ...
- spoj1433 KPSUM
题意:略: 首先知道10,20,......100,200,1000的前面的符号都是负号. 举具体例子:221时,计算过程为 000-009, 010-019, 020-029...... ...
- jTimer
很多时候我们需要按时间间隔执行一个任务,当满足一定条件时停止执行.此插件旨在解决这一经常遇到的问题. jTimer: (function ($) { $.extend({ timer: funct ...
- Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 1)C. Morse Code
题意:给你n个01字符,每次问你前缀的所有本质不同的子串,由摩斯密码组成的方案数和. 题解:离线处理,把字符建sam,通过topo序来dp计算每个节点表示的子串方案数的和.统计答案时,把n个字符挨个匹 ...