2.1什么是排序
本节将对各种各样的排序算法进行介绍,且输入的数字个数都设定为n。
2.2冒泡排序
其就是从序列右边开始比较两个数字的大小,再根据结果交换两个数字的位置。数字就会像是泡泡一样,慢慢从右向左浮到序列的顶端,所以这个算法才被称作冒泡序列。6
在冒泡排序种,总的排序顺序为n的2次方/2。此结果恒定,与输入数据的排列顺序无关。冒泡排序的时间复杂度为O(n^2)。
2.3选择排序
每次都从待排序的数据中寻找最小值,使用线性查找,将其与序列最左面的数字进行交换。
同样需要比较大约n^2 /2次。时间复杂度同样恒为O(n^2)。
2.4插入排序
插入排序从左边开始,一般左边视作已排序区域,右边视作未排序区域。其思路是从右边的未排序区域内取出一个数据,然后把插入到已排序区域内合适的位置上。
时间复杂度仍为O(n^2)。
2.5堆排序
将n个数据存进堆里,其所需时间为O(nlog n)。每插入一个数据所花时间为O(log n)。时间复杂度为O(nlog n)。其比第二章前面的数据结构时间所花时间都要短,相对比较简单。
2.6归并排序
归并排序算法会将序列分成长度相同的两个子序列,当无法在分的时候,对子序列进行归并。归并就是把两个排好序的子序列合并成一个有序序列。一直往下操作,直到所有子序列合并为一个整体为止。
每一行的比较时间为O(n)。有以2为底n的对数行,因此总的运行时间为O(nlog n)。
2.7快速排序
快速排序时要在序列中选择一个基准值,将除了基准值外的数分为“比基准值小的数”和“比基准值大的数”这两个类别,再从两个类别中寻找基准值。然后一层层向下寻找基准值。
快速排序实则是一种分治法,将原本复杂的问题变成了俩个子问题,再分别解决,知道子问题中只剩下一个数字为止。
如果每次选择的基准值都能将序列分为原本的一半,那么运行时间为O(nlog n)。若运气不好,每次都选择最小值作为基准值,则运行时间为O(n^2)。