1,插入排序
2,冒泡排序
3,归并排序
4,快速排序
5,二分查找
排序算法
【核心思想】
在编写代码的过程中,迭代是一个很重要的思想。
我们应该解决的是性质上的问题,而不应该把所有的目光聚焦于过程上。
每次迭代的结果只能是体量的大小不同,而不能是性质上的不同。
比如说在“插入排序”算法之中,我们应该如下思考问题
1,假设在插入之前序列是已经排序过的
2,将需要插入的元素放在合理的位置
如何做到,插入之前的元素是已经排序过的。——从最小单位开始排序
如果只有一个单位,那就是已经排序好的,对第二次迭代来说,第一次就是已经排序好的序列
如何做到,将需要插入的元素放在合理的位置——把要插入的元素与之前序列的每一个元素进行比较,若该元素大于插入元素则向后平移一个单位
插入排序
有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为 O(n^2)。是稳定的排序方法。
插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。
插入排序的基本思想是:每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。
排序过程如下:
- 从第一个元素开始,该元素可以认为已经被排序;
- 取出下一个元素,在已经排序的元素序列中从后向前扫描;
- 如果该元素(已排序)大于新元素,将该元素移到下一位置;
- 重复步骤 3,直到找到已排序的元素小于或者等于新元素的位置;
- 将新元素插入到该位置后;
- 重复步骤 2 ~ 5,直至最后一个元素。
代码:
2,冒泡排序
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从 A 到 Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素已经排序完成。 这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
冒泡排序的运行过程如下:
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
排序过程:
- 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
- 设定两个指针,最初位置分别为两个已经排序序列的起始位置
- 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
- 重复步骤 3 直到某一指针到达序列尾
- 将另一序列剩下的所有元素直接复制到合并序列尾
【思想】
归并排序用的是,分治的思想。
即把一个大问题拆分成几个小问题之和。
我们可以把一个数列理解为,两个已经排序好的数列重新排列
我们可以先用递归的思想,把问题细分到每一个小问题,然后重小问题开始解决。
我们只需要处理最小单位的问题即可。
即,把最小单位的子序列,进行左右排序。
在数列中,我们可以用 i , j 来指代指针。
只有两个子序列已经排序好了,我们才可以用++递增来进行指针的平移。
现在我们只需要搞清楚,如何写循环就好。
我们在处理多个单位的时候,要使用循环,循环只要写结束条件就好。(问题在于如何判断结束条件)
快速排序
快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),简称快排,也是一种排序算法。最早由东尼·霍尔提出。在平均状况下,排序 n 个项目要 O(nlogn) 次比较。在最坏状况下则需要 O(n^2) 次比较,但这种状况并不常见。事实上,快速排序 O(nlogn) 通常明显比其他算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地达成。
快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。
步骤为:
- 从数列中挑出一个元素,称为“基准”(pivot),
- 重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任何一边)。在这个分割结束之后,该基准就处于数列的中间位置。这个称为分割(partition)操作。
- 递归地(recursively)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归到最底部时,数列的大小是零或一,也就是已经排序好了。这个算法一定会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
【思想】
我们可以把数组看成数轴,如果我们要处理一个数组,我们可以利用 i , j 把数轴进行分段,我们要处理整段数轴的话,我们可以把大问题拆分成处理无数个小数轴。
一般来说,我们会利用递归方法来进行分段,以基准点的左和右进行划分,最后就可以把一整个数轴,划分成无数小段。我们只需要写一个处理一个小段上的函数就可以通过递归的方法得到所有小段的计算结果。
通过把数轴进行划分,我们可以通过不断收缩划分范围最终得到我们想要的结果。
划分可以分为,规则划分和不规则划分,归并排序即规则划分,快速排序及不规则划分。
如何划分要依据自己的编程思想,根据对每一段函数的基础操作来确定划分的方式。
二分查找
在计算机科学中,二分搜索(英语:binary search),也称折半搜索(英语:half-interval search)、对数搜索(英语:logarithmic search),是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。