一:选择排序的基本介绍
选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,在依规定交换位置后达到排序的目的。
二:选择排序思想
三:选择排序应用实例
有一群牛,颜值分别是101,34,119,100,1,请使用选择排序从低到高进行排序
1 | static void Main(string[] args) |
四:比较排序的效率
选择排序要比冒泡排序快
选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,在依规定交换位置后达到排序的目的。
有一群牛,颜值分别是101,34,119,100,1,请使用选择排序从低到高进行排序
1 | static void Main(string[] args) |
选择排序要比冒泡排序快
1 | static void Main(string[] args) |
引入一个开关,如果此次遍历没有交换值,说明顺序是正确,后面没必要重新多次遍历。
1 | static void Main(string[] args) |
想比较上面的写法,减少了一次遍历。
1 | int len = 10;//修改数据量 |
10个数据冒泡排序比骄1000个数据:
当数据量越大,所需要的时间越长!
排序:排序是将一组数据,依指定的顺序进行排列的过程
排序分类:
内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序。
外部排序:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。
常见的排序算法分类:
时候统计的方法
这种方法可行,但是有两个问题:一是想对设计的算法的运行性能进行评测,需要实际运行该程序;二是所得时间的统计量依赖于计算机的硬件下、软件等环境因素,这种方式,要在同一台计算机的相同状态下运行,才能 比较哪个算法速度更快。
事前估算的方法
通过分析某一个算法的时间复杂度来判断哪个算法更优。
一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)
举例说明:
特点:
常数阶O1
1 | //定义一个max表示有多少皇后 |
递归就是方法自己调用自己,每次调用时传入不同的变量,递归有助于编程者解决复杂问题。
打印问题
1 | public static void test(int n) |
递归-迷宫问题
1 | //使用递归回溯来给小球栈路 |
初始化两个栈:运算符栈s1和储存中间结果的栈s2
从左至有扫描中缀表达式
遇到操作数时,将其压入s2
遇到运算符时,比较其与s1栈顶运算符的优先级:
遇到括号时:
重复2至5,直到表达式的最右边
将s1中剩余的运算符依次弹出并压入s2
依次弹出s2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式
1 | 中缀表达式1+((2+3)*4)-5==>后缀表达式123+4*+5- |
1 | public List<string> parseSuffixExpressionList(List<string> ls) |
1 | public class PolandNotation |
举例说明:
1 | (3+4)*5-6 |
对应的前缀表达式就是
1 | -*+3456 |
1) .中缀表达式就是常见的运算表达式,如(3+4)*5-6
2).中缀表达式的求职是我们人最熟悉的,但是对计算机来说缺不好操作,因此,在计算结果时,往往会将中缀表达式转成其他表达式操作
1.后缀表达式有称逆波兰表达式与前缀表达式像似,只是运算符位于操作数之后
2.举例说明:
1 | (3+4)*5-6 |
对应的后缀表达式就是
1 | 34+5*6- |
3.在对比:
使用栈计算:
$$
722-5+1-5+3-4的值,
$$
模拟计算机的底层操作!
使用数组设置的栈:
1 | public class ArrayStack2 |
在Main函数中执行:
1 | static void Main(string[] args) |
1 | public class ArrayStack |
1 | public class LinkedStack |