1.冒泡排序

一趟排序的过程,将相邻的两个元素进行比较,如果前一个比后一个大,则将两个元素交换——将最大的元素交换到整个数据的最后。
排序的趟数 = 数据元素的个数 = len - 1

#include<iostream>
using namespace std;/*
时间复杂度:O(n^2)
空间复杂度:O(1)
稳定性: 稳定的
*/
void BubbleSort(int* arr, int len)
{for (int i = 0; i < len; i++){bool flag = true;//优化用的,有序的话,提前退出for (int j = 0; j < len - 1 - i; j++){if (arr[j] > arr[j + 1]){swap(arr[j], arr[j + 1]);flag = false;}}if (flag)//说明不存在前面一个元素比后面一个元素大的情况{return;}}
}

2.选择排序

2.1选择排序的思想
先遍历一遍整个待排序数据,找到当前最大的值的位置 ,将标记的最大值与当前最后一个元素交换。
重复上述过程,直到只剩下一个数据。
总结来说,就是找到当前没排序的最大值,与没排序的最后一个元素交换,和冒泡排序一样,也是一次确定一个最大值。
上面的步骤每做一次,下一次就少遍历一个数据(本次找到的最大值)
选择排序执行的趟数 = 数据元素的个数 len - 1

/*
时间复杂度: O(n^2)
空间复杂度: O(1)
稳定性: 不稳定
*/
void SelectSort(int* arr, int len)
{for (int i = 0; i < len; i++){int maxindex = 0;//未排序中记录最大值下标for (int j = 0; j < len - i; j++){if (arr[j] > arr[maxindex]){maxindex = j;}}swap(arr[maxindex], arr[len -1- i]);//将最大值与当前未排序的最后一个元素交换}
}

3.直接插入排序

将数据分成两部分,前一段是已经有序的数据(初始时,前一段数据只有一个),后一段都是无序数据。
从无序数据中拿一个数据(无序数据的最左边的第一个数据),插入到前一段的有序数据中,并且使得有序数据段依旧有序。
重复上述过程,直到无序数据没有数据。

做一次插入排序后:

/*
时间复杂度:O(n^2)
空间复杂度:O(1)
稳定性: 稳定
*/
void InsertSort(int* arr, int len)
{for (int i = 1; i < len; i++)//i负责遍历无序数据段{int tmp = arr[i];//保存未排序段的最左边的值int j = i - 1;for (; j >= 0; j--){if (arr[j] <= tmp)//找到有序数据段从右边数第一个小于等于tmp的数据,把tmp放在这个数据右边{break;}arr[j + 1] = arr[j];}arr[j + 1] = tmp;}
}

如果数据有序,其时间复杂度为 : O(n)

排序算法——冒泡排序、选择排序、直接插入排序相关推荐

  1. 排序---初级排序算法(选择排序、插入排序和希尔排序)

    写在前面的话: 一枚自学Java和算法的工科妹子. 算法学习书目:算法(第四版) Robert Sedgewick 算法视频教程:Coursera  Algorithms Part1&2 本文 ...

  2. 函数模板案例_利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试

    案例描述: 利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试 #include <iostream& ...

  3. 排序算法 | 直接选择排序,算法的图解、实现、复杂度和稳定性分析

    排序算法 | 直接选择排序,算法的图解.实现.复杂度和稳定性分析 目录 1.直接选择排序的原理 2.图解直接选择排序 3.算法代码实现 4.算法复杂度分析.稳定性分析 直接选择排序 1.直接选择排序的 ...

  4. 堆排序算法c语言筛选法,【排序】排序算法之选择排序

    排序算法之选择排序 罗朝辉(http://www.cppblog.com/kesalin) 转载请注明出处 排序是数据处理中经常使用的一种重要运算,在计算机及其应用系统中,花费在排序上的时间在系统运行 ...

  5. 【排序算法】选择排序(Selection sort)

    选择排序(Selection sort)是一种简单直观的排序算法. 选择排序介绍 它的基本思想是: 首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置:接着,再从剩余未排序的元 ...

  6. 排序算法(3)选择排序

    排序算法(3)选择排序 原理:思想:两个变种(1)单侧选择:在一个无序数组中选择出每一轮中最大值(或最小值)元素,放到最前面或最后面(升序)(2)双向选择:在一个无序数组中选择出每一轮中最值元素,然后 ...

  7. Java经典排序算法:选择排序,动图演示排序过程

    Java经典排序算法:选择排序,动图演示排序过程 示意动图: public class Main {public static void main(String[] args) {new Main() ...

  8. 【排序算法】选择排序(C语言)

    [排序算法]-- 选择排序 目录 一.选择排序的原理 二.选择排序的代码实现 三.选择排序的优化 1. 优化思路 2. 排序优化后问题 3. 优化代码的实现 四.选择排序的效率 一.选择排序的原理 ​ ...

  9. 选择排序算法流程图_常用排序算法之选择排序

    前两天给大家分享了冒泡排序和插入排序(没关注的同学,可以关注后查看历史消息),今天继续给大家分享另一种常用的排序算法--选择排序. 选择排序 选择排序和插入排序很相似,也区分已排序区间和未排序区间,选 ...

  10. 排序算法之选择排序(简单选择排序、堆排序)

    选择排序(简单选择排序.堆排序) 选择排序 简单选择排序 概念 算法实现 堆排序 概念 算法实现 后续 选择排序 选择排序的基本思想是:每一趟在待排序元素中选取关键字最小(或最大)的元素加入有序子序列 ...

最新文章

  1. tf.get_variable
  2. LeetCode LFU Cache
  3. 一个小的日常实践——距离阵列
  4. HABBY CEO王嗣恩:这个下载量近20亿的爆款,曾被我推翻重做两次
  5. spring集成jndi_Spring应用程序与JNDI连接池的集成测试
  6. Pycharm Anaconda 安装dlib
  7. zTree:实现单选/取消父子关联等
  8. mac 下 使用 java运行 class 文件 总是提示 “错误: 找不到或无法加载主类”的解决方法...
  9. [Learn Notes] CSS学习笔记
  10. 避免Unity变量初始化错误的8条建议
  11. pandas.Series.asfreq
  12. 解决微信调整字体大小导致Html5页面混乱
  13. 关于cmp函数参数中的符号(转)
  14. xpath获取标签的属性值_[Selenium]12.加餐: 如何手写xpath
  15. 关于数组越界(内存泄漏)的那点事儿(C语言)
  16. Aliyun mysql配置 远程访问 10038
  17. android 选择 播放器,Android 播放--播放器里面 demo 类的说明与选择
  18. 正则表达式提取身份证号码
  19. adb 命令行导出Android APP数据库.db文件
  20. [C++]牛客 WY11 星际穿越

热门文章

  1. [LeetCode] Move Zeroes - 整数数组处理问题
  2. 【数据结构与算法】之深入解析“最小覆盖子串”的求解思路与算法示例
  3. 2014/School_C_C++_A/3/x的x次幂
  4. 2013年第四届蓝桥杯C/C++ A组国赛 —— 第四题:约数倍数选卡片
  5. PAT (Basic Level) Practice (中文)1006 换个格式输出整数 (15 分)
  6. 征战蓝桥 —— 2017年第八届 —— C/C++A组第5题——字母组串
  7. 大数据互联网架构 tomcat集群配置时三个端口的作用
  8. 计算机视觉之OpenCV教程 ---Mat类基础(一)
  9. 【Ubuntu】Linux必备软件之Samba
  10. 【Android】Android中WIFI开发总结(二)