目录
一、排序算法
排序算法有很多: 冒泡排序/选择排序/插入排序/归并排序/计数排序(counting sort)/基数排序(radix sort)/希尔排序/堆排序/桶排序.
简单排序: 冒泡排序 - 选择排序 - 插入排序
高级排序: 归并排序 - 快速排序
二、大O表示法
企业规模的概述:
- 公司可以按照规模分为:小型企业/中型企业/大型企业.
- 在不说明具体员工人数或者占地面积的情况下,我们可以通过这样大概的概念来描述企业的规模
大O表示法:
- 在算法的描述中,我们也可以通过类似的快捷方式来描述计算机算法的效率.
- 在计算机中,这种粗略的度量被称作”大O”表示法
- 在算法比较的过程中,我们可能更喜欢说:算法A比算法B快两倍.但是这样的比较有时候没有意义.
- 在数据项个数发生变化时,算法的效率会跟着发生改变
- 所以我们通常使用一种算法的速度会如何跟随着数据量的变化的.
常见的大O表示法
推导大O表示法
1. 用常数1取代运行时间中的所有加法常数。 // 76 ==1
2. 在修改后的运行次数函数中,只保留最高阶项。
3. 如果最高阶项存在且不是1,则去除与这个项相乘的常数。2N²+3N+1 ==> N²
三、简单排序
1、冒泡排序
冒泡排序的思路:
- 对未排序的各元素从头到尾依次比较相邻的两个元素大小关系
- 如果左边的队员高, 则两队员交换位置
- 向右移动一个位置, 比较下面两个队员
- 当走到最右端时, 最高的队员一定被放在了最右边
- 按照这个思路, 从最左端重新开始, 这次走到倒数第二个位置的队员即可.
- 依次类推, 就可以将数据排序完成
思路再分析:
- 第一次找出最高人放在最后, 我们需要两个两个数据项进行比较, 那么这个应该是一个循环操作.
- 第二次将次高的人找到放在倒数第二个位置, 也是两个比较, 只是不要和最后一个比较(少了一次), 但是前面的两个两个比较也是一个循环操作.
- 第三次...第四次...
- 有发现规律吗? 这应该是一个循环中嵌套循环, 并且被嵌套的循环次数越来越少的.
- 根据这个分析, 你能写出代码实现吗?
冒泡排序的效率
- 冒泡排序的比较次数:
- 如果按照上面的例子来说, 一共有7个数字, 那么每次循环时进行了几次的比较呢?
- 第一次循环6次比较, 第二次5次比较, 第三次4次比较....直到最后一趟进行了一次比较.
- 对于7个数据项比较次数: 6 + 5 + 4 + 3 + 2 + 1
- 对于N个数据项呢? (N - 1) + (N - 2) + (N - 3) + ... + 1 = N * (N - 1) / 2 N²
大O表示法:
- 大O表示法是描述性能和复杂度的一种表示方法.
- 推导大O表示法通常我们会使用如下规则:
- 用常量1取代运行时间中的所有加法常量
- 在修改后的运行次数函数中, 只保留最高阶项
- 如果最高阶项存在并且不是1, 则去除与这个项相乘的常数.
通过大O表示法推到过程, 我们来推到一下冒泡排序的大O形式.
- N * (N - 1) / 2 = N²/2 - N/2,根据规则2, 只保留最高阶项, 编程N² / 2
- N² / 2, 根据规则3, 去除常量, 编程N²
- 因此冒泡排序的大O表示法为O(N²)
冒泡排序的交换次数:
- 冒泡排序的交换次数是多少呢?
- 如果有两次比较才需要交换一次(不可能每次比较都交换一次.), 那么交换次数为N² / 4
- 由于常量不算在大O表示法中, 因此, 我们可以认为交换次数的大O表示也是O(N²)c