数据结构——排序算法(冒泡排序、选择排序、插入排序、归并排序、快速排序、搜索算法)

目录

一、排序算法

二、大O表示法

三、简单排序

1、冒泡排序

2、选择排序

3、插入排序

四、高级排序

1、归并排序

2、快速排序

五、搜索算法


一、排序算法

排序算法有很多: 冒泡排序/选择排序/插入排序/归并排序/计数排序(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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值