排序算法-O(n^2)-优化后的冒泡、简单选择、直接插入 代码实践、解释等
博主将代码先撸为敬,具体解释均在代码里面。
一 以表格的形式整体出各经典算法的定义(多个版本)、理解、示例、比较、总结等
--------------------为反馈划下华丽的分割线--------------------
...
------------------------------------------------------------------
二 代码实践
(1)运行结果:
优化后的冒泡排序(升序)
优化后的冒泡排序(降序)
简单选择排序(升序)
直接插入排序(升序)
(2)代码:
#include <iostream>
#include <string>
#include <vector>
#include <array>using namespace std;//用来输出数组
void coutFun(int r[],int n)
{for (int k = 0; k < n; k++)cout << r[k] << endl;cout << " " << endl;
}//冒泡排序_优化(1)_升序版
void bubbleSort(int r[],int n)//int r[] 的形参 接收 int*的实参???怎么一回事啊???C++直接传递引用 起别名
{int bubbleSort_flag = -1;for (int i = 0; i < n - 1; i++){bubbleSort_flag = 0;//标记排序是否已经提前完成,即数列中的元素是否已经提前有序for (int j = 0; j < n - i - 1; j++)//j < n - i; 会导致r[j + 1]数组下标越界 可以 7 2 8 0 为例 //改为 n-i-1 除去已经排好的大数,找到最大的数进行比较//for (int j = i + 1; j <= n - 1; j++)//这样写少了小的数进行上升 如 7 2 8 0 上面的j < n - i - 1;这种写法表示相对最大的数已经陈到底部,不用去考虑,只需要考虑小的数如何上升就ok了{if (r[j]>r[j + 1]){swap(r[j], r[j + 1]);bubbleSort_flag = 1;}}//假如有N-1趟,假设在第N-5趟排序就已经完成,数列有序,那么bubbleSort_flag = 0 不再进行(N-1)-(N-5) = 4趟的排序if (bubbleSort_flag != 1)break;}//输出数组coutFun(&r[0],n);
}//冒泡排序_优化(2)_Good_倒序版
void bubbleSort2(int r[], int n)
{int bubbleSort_flag2 = -1;//从r[0 1 ... j-1]中找到相对最小的数放到最后 for (int i = n - 1; i > 0; i--){bubbleSort_flag2 = 0;for (int j = 0; j < i; j++){if (r[j] < r[j + 1]){swap(r[j], r[j + 1]);int bubbleSort_flag2 = 1;}}if (bubbleSort_flag2 == 1)break;}//输出数组coutFun(&r[0], n);}//简单选择排序
void selectSort(int r[], int n)
{int min = 0, selectSort_flag = -1;for (int i = 0; i < n - 1; i++){//selectSort_flag = 0;min = i;//关键词:下标 找到最小的那个数的下标 交换到第一个位置上去 以此类推for (int j = i + 1; j <= n - 1; j++){if (r[j] < r[min]){min = j;//selectSort_flag = 1;//这样写其实毫无意义 因为r[i+1 ... n-1]必须与r[min]比较完 选择排序是位置有序 将相对最小的数依次插入}}if (i != min)swap(r[i], r[min]);}//输出数组coutFun(&r[0], n);
}//直接插入排序
//理解上课可等价于线性表的插入
void insertSort(int r[], int n)
{int i, j, temp = 0;for (i = 1; i <= n - 1; i++){temp = r[i];if (r[i - 1] > r[i])//找到 “要插谁”{for (j = i - 1; r[j] > temp; j--)//找到 “插在哪”{r[j + 1] = r[j];}r[j + 1] = temp;}}//输出数组coutFun(&r[0], n);
}int main()
{int flag = 0;//退出循环flag//输入界面//vector类创建动态数组 堆区int n, cmd, *pt_vector;while (1){cout << "0:退出 1:优化的冒泡排序(1)_升序版" << endl;cout << "2:优化的冒泡排序(2)_Good_倒序版 3:简单选择排序" << endl;cout << "4:直接插入排序 " << endl;cout << "请输入命令(即数字0~4):";cin >> cmd;if (cmd == 0)break;cout << "请输入要排序的数字的个数:";cin >> n;vector<int>r(n);cout << "依次输入需要排序的那" << n << "个数:" << endl;for (int i = 0; i < n; i++)cin >> r[i];cout << endl;pt_vector = &r[0];switch (cmd){case 1:bubbleSort(pt_vector, n); break;//冒泡排序_优化(1)case 2:bubbleSort2(pt_vector, n); break;//冒泡排序_优化(2)_Goodcase 3:selectSort(pt_vector, n); break;//简单选择排序case 4:insertSort(pt_vector, n); break;//直接插入排序}}system("pause");return 0;
}//【01】冒泡排序_优化
/*一维数组大数下沉,小(的)数上浮,故称冒泡。外循环 N个元素N-1趟比较 内循环 相邻两数两两比较,大则交换。
*///【02】简单选择排序
/*选择排序是位置有序 将相对最小的数依次插入各位置
*///【03】直接插入法
/*两个关键,要插谁?插哪里?理解上课可等价于线性表的插入
*/
排序算法-O(n^2)-优化后的冒泡、简单选择、直接插入 代码实践、解释等相关推荐
- 基础排序算法详解与优化
文章图片存储在GitHub,网速不佳的朋友,请看<基础排序算法详解与优化> 或者 来我的技术小站 godbmw.com 1. 谈谈基础排序 常见的基础排序有选择排序.冒泡排序和插入排序.众 ...
- 排序算法--快排的优化
排序算法–快排的优化 下面是我写的一种快排: #include <iostream> #include <stdlib.h>using namespace std;void P ...
- 十大经典排序算法之冒泡排序及其优化
一.冒泡排序 1.冒泡排序算法的原理如下: 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大 ...
- 【算法之美】不要再用冒泡、选择、插入排序了,丢不起这人!
文章目录 1. 冒泡排序 2. 选择排序 3. 插入排序 4. 快速排序 5. 堆排列 6. 归并排列 7. 希尔排序 8. 优化后的快排函数sort() 前言 排序算法在算法与数据结构中很常见,在学 ...
- 十大经典排序算法之快速排序及其优化
一.快速排序 1.基本思想: 1.先从数列中取出一个数作为基准数. 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边. 3.再对左右区间重复第二步,直到各区间只有一个数. ...
- 排序算法入门之冒泡排序优化
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 这篇文章 ...
- 【智能优化算法】基于全局优化的改进鸡群算法求解单目标优化问题(ECSO)附matlab代码
1 简介 智能算法分为两种,一种是群体智能算法(swarmintelligencealgorithm),该算法大多模拟自然界中动植物的特有行为,并将其表达成数学语言,从而进行迭代寻优,如模拟蝙蝠回声定 ...
- MATLAB算法实战应用案例精讲-【智能优化算法】斑点鬣狗优化-SHO(附python和matlab代码)
目录 前言 算法原理 算法思想 1.1包围机制 1.2 狩猎机制 1
- 基于对立非洲秃鹫优化算法求解单目标优化问题(OAVOA)含Matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信.
最新文章
- buuctf N种方法解决
- python条件表达式连起来写一段话_python学习笔记十三条件表达式应用
- SAP S/4HANA里的生产订单,标识其已经结束生产可以发货的字段
- linux命令wget多个参数,wget 命令参数使用方法
- Linux NAT网络连接权威指南
- @Async join
- 疫期公共出行更安心 微信支付上线“新冠肺炎保障”
- Foxit PDF SDK 下载地址
- linkin大话设计模式--命令模式
- android-x86 下载地址
- 统计学习基础(第二版)——引言
- math.js api static function
- 携手做大做强中国集成电路产业链
- 开源公告|微信云端深度学习推理框架WeChat TFCC开源啦!
- app兼容性测试方案
- 头条号项目玩法:中视频全方位教学
- java 控制台类_Java Console类(控制台)
- 【Windows】使用【老毛桃】PE系统进行Windows系统的镜像备份
- Unity3D开发之----将预设体Prefab压缩成AssetBundle文件
- android 主流机型排行,安卓手机性能排行:华为Mate40 Pro仅排第四,第一名无可撼动...