算法是解决一类问题的方法
排序算法 根据元素大小关系排序 从小到大 从大到小
冒泡 选择 插入 快排
希尔排序 归并排序 堆排序

冒泡排序 从头到尾比较 每一轮将最大的数沉底 或者最小数字上浮

选择排序 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语言部分)之 排序(冒泡 选择 插入 快排)的更多相关文章

  1. 前端学习(三十八)vue(笔记)

    Angular+Vue+React    Vue性能最好,Vue最轻=======================================================Angular     ...

  2. Salesforce LWC学习(三十八) lwc下如何更新超过1万的数据

    背景: 今天项目组小伙伴问了一个问题,如果更新数据超过1万条的情况下,有什么好的方式来实现呢?我们都知道一个transaction只能做10000条DML数据操作,那客户的操作的数据就是超过10000 ...

  3. Java进阶(三十八)快速排序

    Java进阶(三十八)快速排序 前言 有没有既不浪费空间又可以快一点的排序算法呢?那就是"快速排序"啦!光听这个名字是不是就觉得很高端呢. 假设我们现在对"6 1 2 7 ...

  4. python3.4学习笔记(十八) pycharm 安装使用、注册码、显示行号和字体大小等常用设置

    python3.4学习笔记(十八) pycharm 安装使用.注册码.显示行号和字体大小等常用设置Download JetBrains Python IDE :: PyCharmhttp://www. ...

  5. 学习笔记:CentOS7学习之十八:Linux系统启动原理及故障排除

    目录 学习笔记:CentOS7学习之十八:Linux系统启动原理及故障排除 18.1 centos6系统启动过程及相关配置文件 18.1.1 centos6系统启动过程 18.1.2 centos6启 ...

  6. Java开发学习(三十六)----SpringBoot三种配置文件解析

    一. 配置文件格式 我们现在启动服务器默认的端口号是 8080,访问路径可以书写为 http://localhost:8080/books/1 在线上环境我们还是希望将端口号改为 80,这样在访问的时 ...

  7. NeHe OpenGL教程 第三十八课:资源文件

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  8. SQL注入之Sqli-labs系列第三十八关、第三十九关,第四十关(堆叠注入)

    0x1 堆叠注入讲解 (1)前言 国内有的称为堆查询注入,也有称之为堆叠注入.个人认为称之为堆叠注入更为准确.堆叠注入为攻击者提供了很多的攻击手段,通过添加一个新 的查询或者终止查询,可以达到修改数据 ...

  9. 微信小程序把玩(三十八)获取设备信息 API

    原文:微信小程序把玩(三十八)获取设备信息 API 获取设备信息这里分为四种, 主要属性: 网络信息wx.getNetWorkType, 系统信息wx.getSystemInfo, 重力感应数据wx. ...

随机推荐

  1. 论文笔记:Dynamic Multimodal Instance Segmentation Guided by Natural Language Queries

    Dynamic Multimodal Instance Segmentation Guided by Natural Language Queries 2018-09-18 09:58:50 Pape ...

  2. idea提示不区分大小写,解决方法

  3. Symbol Vs String

    最重要区别 1 symbol存入内存后,始终存在,如果不进行垃圾收集,可能导致内存泄漏. String只会存在于某个创建它的作用域内.即有生命周期的. 2.唯一性. \\进入控制台 >" ...

  4. [LeetCode]题15:3Sum

    第一次解: res = [] nums.sort() if len(nums)<3:return [] for i in range(len(nums)-2): left = i+1 right ...

  5. 【转载】基于webpack构建react项目

    第一部分链接:下载所需内容并构建基础的页面 第二部分链接:添加webpack中的一些常用babel和loader 第三部分链接:开发环境与生产环境的配置

  6. 数据结构与算法之PHP排序算法(快速排序)

    一.基本思想 快速排序又称划分交换排序,是对冒泡排序的一种改进,亦是分而治之思想在排序算法上的典型应用. 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部 ...

  7. Django框架(四)

    八.Django 模型层(2) 多表操作 创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息. ...

  8. SQL列转行用逗号隔开

      declare @result varchar(255) set @result = ” select @result = @result + cast(F_IT_FWID as varchar( ...

  9. python 爬虫 记录

    python3 爬虫需要安装:requests,beautifulsoup4,html5lib 带有中文的需要这样写,要不然就会出现乱码 html = response.content.decode( ...

  10. Saiku免登录嵌入其他系统使用(十一)

    Saiku免登录嵌入其他系统使用 Saiku可通过iframe嵌入其他系统使用,但是正常情况下都需要先登录系统,然后还需要登录saiku,最后才能访问saiku中的数据 下面来讲解一下如何使Saiku ...