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. ...
随机推荐
- luogu3426 [POI2005]SZA-Template 后缀树
链接 bzoj不能auto https://www.luogu.org/problemnew/show/P3426 思路 这个要求的串一定是S的前缀和S的后缀. 转化一下 建立出来fail树(fail ...
- HDFS简单编程实例:文件合并
下图显示了HDFS文件系统中路径为“localhost:50070/explorer.html#/user/hadoop”的目录中所有的文件信息: 对于该目录下的所有文件,我们将执行以下操作: 首先, ...
- Android 按钮响应事件的几种方式
目录 1.在布局中指定onClick属性 2.使用匿名内部类 3.在当前Activity中实现OnClickListener接口 4.创建内部类 1.在布局中指定onClick属性 布局代码 < ...
- Android查看appPackage和Activity的多种方法
方法一 有源码的情况直接打开AndroidManifest.xml文件,文件会有package信息 android.intent.action.MAIN决定应用程序最先启动的Activity andr ...
- weex playGround 扫码空白问题
首先安装 weex debug 用 weex debug调试可以看到报错 我做的demo扫码扫不出来 是因为:class的原因 weex中:class只支持数组形式 或者 换成:style就可以 ...
- icpc2018-焦作-E Resistors in Parallel-数论+大数
http://codeforces.com/gym/102028/problem/E 定义n种电阻,阻值r[i]={ inf | i%d2==0 && d>1 , i | e ...
- js css 多个按需要顺序加载
https://github.com/rgrove/lazyload/
- VS2015在win10上编译的程序不能在Win7上运行的原因
研究了下,搞懂原理了.是VS 2015 编译的问题,因为我是Win 10 ,所以会用到win 10 的SDK ,这个SDK 依赖了Universal C Runtime ,就是API-MS-CRT-X ...
- python -- 约束、异常处理、MD5
1.类的约束 1.写一个父类,父类中的某个方法要抛出一个异常 NotImplementedError class Base: # 对子类进行了约束,必须重写该方法 def login(se ...
- atom插件安装失败解决方法
在atom 上下载插件失败,可以用下面的方法. 1.找到C:/Users/你的用户名/.atom/packages/文件夹内 2.在.atom packages 目录下 使用gitbash 3.git ...