What?
什么叫排序算法?
所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排序的方法,排序算法在很多领域得到想当的重视,尤其是在大量数据的处理方面。一个优秀的算法可以节省大量的资源,在各个领域中考虑到数据的各种限制和规范,要得到一个符合实际的优秀算法,得经过大量的推理和分析。
常用的排序算法有很多:
插入排序(直接插入和希尔排序)、选择排序(简单选择排序和堆排序)
交换排序(冒泡排序和快速排序)、归并排序、基数排序
冒泡排序:
这是一种较简单的排序算法,他重复地走过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来,走访数列的工作是重复的进行直到没有再需要交换,也就是说该数列已经排序完成,这个算法的名字由来是因为越大的元素会经过交换慢慢“浮”到数列的顶端,故名。
原理:
1、比较相邻的元素,如果第一个比第二个大,就交换。
2、对每一对相邻元素做同样的工作,从开始第一队到结尾的最后一对,在这一点,最后的元素应该会是最大的数。
3、针对所有的元素重复以上的步骤,除了最后一个。
4、持续每次对原来越少的元素重复以上的步骤,知道没有任何一个数字需要比较。
分析:
时间复杂度:
若文件的初始状态是正序的,一趟扫描即可完成排序,所需的关键字比较次数C和记录次数M均达到最小值:
Cmin=n-1, Mmin=0,所以冒泡排序最好的时间复杂度为O(n)。若初始文件是反序的,需要进行n-1趟排序,每趟排序要进行n-i(1≤i≤n-1)此关键字的比较,且每次比较都必须移动记录3次来达到交换记录位置,在这种情况下,比较和移动次数均达到最大值:
冒泡排序的最坏时间复杂度为O(n2) ,综上,冒泡排序总的平均时间复杂度为O(n2).
算法稳定性:
冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。
选择排序法
一种简单直观的排序算法,他的工作原理是每一次从待排序的数据元素中选出最小(大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素全部排完。也就是说,假设一个最大(小)的,去跟剩下的每一个元素去比较,如果比假设的那个大(小),就换成新的数来当假设的那个最大(小)的。
原理:
稳定性:
选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。比较拗口,举个例子,序列5 8 5 2 9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中两个5的相对前后顺序就被破坏了,所以选择排序是一个不稳定的排序算法。
插入排序
有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据插入到已经排好序的有序数据中,从而得到一个新的,个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2), 是稳定的排序方法。
插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。
原理:
每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。
排序算法如果利用好,会给我们带来很多效益,以上只是一些简单的认识,更多的还要继续深入学习。