排序算法有很多种,如冒泡排序、堆排序、快速排序等;
冒泡排序是大学的初学算法,也被很多人所熟知,这里不详细讨论,实现方式如下:
快速排序使用分治法,将一个list分为两个子list:
算法步骤:
1 从数列中挑出一个元素,作为基准,
2 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区操作。
3 递归地把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归的最底部情形,是数列的大小是零或一
以上为分区操作,随机选择一个基准,将list以基准为中心进行左右分区,返回新列表的基准所在位置
以上为递归排序执行部分,之所以自己写数组切分方法,而不是直接使用列表的subList方法,是因为subList方法是使用的游标切分列表,获取的子列表的元素和原有列表使用的是同一地址,
修改其中任一列表的元素,另一列表也会跟着改变。这里需要把列表切分成两个独立的子列表。
另外简单记录下两个较为实用的查找算法
二分查找算法是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜 素过程结束;
如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组 为空,则代表找不到。
线性查找算法:
算法解决的问题是从某n个元素的序列中选出第k大(第k小)的元素
算法步骤:
1、将n个元素每5个一组,分成n/5(上界)组。
2、取出每一组的中位数,任意排序方法。
3、递归的调用selection算法查找上一步中所有中位数的中位数,设为x,偶数个中位数的情况下设定为选取中间小的一个。
4、用x来分割数组,设小于等于x的个数为k,大于x的个数即为n-k。
5、若i==k,返回x;若i<k,在小于x的元素中递归查找第i小的元素;若i>k,在大于x的元素中递归查找第i-k小的元素。
终止条件:n=1时,返回的即是i小元素。
原文地址:https://www.cnblogs.com/monkey-hong/p/9120680.html