重难点分析
由一开始的介绍可以知道,所谓冒泡排序,就是比较相邻的
两个数字,如果符合升序(或者降序)的要求就继续向下遍历,
否则将两个连续的数字交换后再进行遍历。
冒泡排序的难点体现在两个方面,一、冒泡过程的实现;
二、边界值的确认
2.1.1 冒泡过程的实现
假设一个数组arr[ ]={7,6,9,4,2,3,8}
下面通过图片,更加直观的了解冒泡排序的实现过程:
边界值的确认
(1)bound表示界限,sz表示数组中的个数,将未排序区间
和已排序区域的区间分为[0,sz-bound)、[sz-bound,sz)。
(2)对于+1、-1;<、<= 等“差一问题”,可以带入具体的值
来判断边界!
代码流程及实现
代码实现流程:
(1)明确要求:以下代码中含有升序、降序两种方法实现冒
泡排序。
(2)计算数组长度:在main中通过sizeof计算数组长度。
(3)进入函数,分为已排序、待排序两个区域,并在待排序
区域中遍历处理相邻两个数字。
选择排序
选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。
1. 算法步骤
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
重复第二步,直到所有元素均排序完毕。
插入排序
插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
插入排序和冒泡排序一样,也有一种优化算法,叫做拆半插入。
将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。
希尔排序
基本思想
希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。希尔排序是记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
我们分割待排序记录的目的是减少待排序记录的个数,并使整个序列向基本有序发展。而如上面这样分完组后,就各自排序的方法达不到我们的要求。因此,我们需要采取跳跃分割的策略:将相距某个“增量”的记录组成一个子序列,这样才能保证在子序列内分别进行直接插入排序后得到的结果是基本有序而不是局部有序。
操作流程图
操作步骤:
初始时,有一个大小为 10 的无序序列。
(1)在第一趟排序中,我们不妨设 gap1 = N / 2 = 5,即相隔距离为 5 的元素组成一组,可以分为 5 组。
(2)接下来,按照直接插入排序的方法对每个组进行排序。
在第二趟排序中,我们把上次的 gap 缩小一半,即 gap2 = gap1 / 2 = 2 (取整数)。这样每相隔距离为 2 的元素组成一组,可以分为 2 组。
(3)按照直接插入排序的方法对每个组进行排序。
(4)在第三趟排序中,再次把 gap 缩小一半,即gap3 = gap2 / 2 = 1。 这样相隔距离为 1 的元素组成一组,即只有一组。
(5)按照直接插入排序的方法对每个组进行排序。此时,排序已经结束。
代码实现
快速排序
基本思想
通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序
实现逻辑
快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。
① 从数列中挑出一个元素,称为 “基准”(pivot),
② 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
③ 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归到最底部时,数列的大小是零或一,也就是已经排序好了。这个算法一定会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去
代码实现
顺序查找
顺序查找的基本思想
顺序查找是一种最简单的线性查找方法。其基本思想是:从表的一端开始,顺序扫描线性表,依次将扫描到的关键字和给定值k相比较,若当前扫描到的关键字与k相等,则查找成功;若扫描结束后,仍未找到关键字等于k的记录,则查找失败。
最基本的顺序查找的算法
算法分析
查找算法的基本工作是关键字的比较,因此顺序查找算法的1时间复杂度为O(n)。顺序查找的算法简单、对存储结构没有要求,且对关键字的次序也无要求,但效率较低。
二分查找
思想:
将数组的第一个数设置为关键字,通过一趟排序将待排记录分割成独立的两部分,其中,第一部分的关键字均比第二部分的关键字小,即第一部分小于等于关键字,第二部分大于关键字,分别对这两部分继续排序,直到整个序列有序。
图解如下:
代码如下: