排序算法——冒泡排序、选择排序、直接插入排序
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)
排序算法——冒泡排序、选择排序、直接插入排序相关推荐
- 排序---初级排序算法(选择排序、插入排序和希尔排序)
写在前面的话: 一枚自学Java和算法的工科妹子. 算法学习书目:算法(第四版) Robert Sedgewick 算法视频教程:Coursera Algorithms Part1&2 本文 ...
- 函数模板案例_利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试
案例描述: 利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试 #include <iostream& ...
- 排序算法 | 直接选择排序,算法的图解、实现、复杂度和稳定性分析
排序算法 | 直接选择排序,算法的图解.实现.复杂度和稳定性分析 目录 1.直接选择排序的原理 2.图解直接选择排序 3.算法代码实现 4.算法复杂度分析.稳定性分析 直接选择排序 1.直接选择排序的 ...
- 堆排序算法c语言筛选法,【排序】排序算法之选择排序
排序算法之选择排序 罗朝辉(http://www.cppblog.com/kesalin) 转载请注明出处 排序是数据处理中经常使用的一种重要运算,在计算机及其应用系统中,花费在排序上的时间在系统运行 ...
- 【排序算法】选择排序(Selection sort)
选择排序(Selection sort)是一种简单直观的排序算法. 选择排序介绍 它的基本思想是: 首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置:接着,再从剩余未排序的元 ...
- 排序算法(3)选择排序
排序算法(3)选择排序 原理:思想:两个变种(1)单侧选择:在一个无序数组中选择出每一轮中最大值(或最小值)元素,放到最前面或最后面(升序)(2)双向选择:在一个无序数组中选择出每一轮中最值元素,然后 ...
- Java经典排序算法:选择排序,动图演示排序过程
Java经典排序算法:选择排序,动图演示排序过程 示意动图: public class Main {public static void main(String[] args) {new Main() ...
- 【排序算法】选择排序(C语言)
[排序算法]-- 选择排序 目录 一.选择排序的原理 二.选择排序的代码实现 三.选择排序的优化 1. 优化思路 2. 排序优化后问题 3. 优化代码的实现 四.选择排序的效率 一.选择排序的原理 ...
- 选择排序算法流程图_常用排序算法之选择排序
前两天给大家分享了冒泡排序和插入排序(没关注的同学,可以关注后查看历史消息),今天继续给大家分享另一种常用的排序算法--选择排序. 选择排序 选择排序和插入排序很相似,也区分已排序区间和未排序区间,选 ...
- 排序算法之选择排序(简单选择排序、堆排序)
选择排序(简单选择排序.堆排序) 选择排序 简单选择排序 概念 算法实现 堆排序 概念 算法实现 后续 选择排序 选择排序的基本思想是:每一趟在待排序元素中选取关键字最小(或最大)的元素加入有序子序列 ...
最新文章
- tf.get_variable
- LeetCode LFU Cache
- 一个小的日常实践——距离阵列
- HABBY CEO王嗣恩:这个下载量近20亿的爆款,曾被我推翻重做两次
- spring集成jndi_Spring应用程序与JNDI连接池的集成测试
- Pycharm Anaconda 安装dlib
- zTree:实现单选/取消父子关联等
- mac 下 使用 java运行 class 文件 总是提示 “错误: 找不到或无法加载主类”的解决方法...
- [Learn Notes] CSS学习笔记
- 避免Unity变量初始化错误的8条建议
- pandas.Series.asfreq
- 解决微信调整字体大小导致Html5页面混乱
- 关于cmp函数参数中的符号(转)
- xpath获取标签的属性值_[Selenium]12.加餐: 如何手写xpath
- 关于数组越界(内存泄漏)的那点事儿(C语言)
- Aliyun mysql配置 远程访问 10038
- android 选择 播放器,Android 播放--播放器里面 demo 类的说明与选择
- 正则表达式提取身份证号码
- adb 命令行导出Android APP数据库.db文件
- [C++]牛客 WY11 星际穿越
热门文章
- [LeetCode] Move Zeroes - 整数数组处理问题
- 【数据结构与算法】之深入解析“最小覆盖子串”的求解思路与算法示例
- 2014/School_C_C++_A/3/x的x次幂
- 2013年第四届蓝桥杯C/C++ A组国赛 —— 第四题:约数倍数选卡片
- PAT (Basic Level) Practice (中文)1006 换个格式输出整数 (15 分)
- 征战蓝桥 —— 2017年第八届 —— C/C++A组第5题——字母组串
- 大数据互联网架构 tomcat集群配置时三个端口的作用
- 计算机视觉之OpenCV教程 ---Mat类基础(一)
- 【Ubuntu】Linux必备软件之Samba
- 【Android】Android中WIFI开发总结(二)