1、排序的基本概念与分类
稳定性: 如ki = kj,排序前i>j,经过排序后,i如果依旧大于j则称为稳定,反之则不稳定。
内排序 : 内排序是在排序整个过程中,待排序的所有记录都防止在内存中。性能收到3个方面影响:1、时间性能 2、辅助空间 3、算法的复杂性
根据排序过程中借助的主要操作,把内排序分为:插入排序、交换排序、选择排序和归并排序。
外排序 : 外排序是由于排序的记录个数太多,不能同时放置在内存,整个排序过程需要在内外存之间多次交换数据才能进行。
2、冒泡排序
冒泡排序(Bubble Sort)是一种交换排序,基本思想:两两比较相邻记录的关键字,如果是反序则交换,直到没有反序记录位置。
3、简单选择排序
简单选择排序法就是通过 n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1≤i ≤n)个记录交换之。
定义略难理解,举个例子,假设数据为[9,4,2,1,3],简单选择排序的想法是先比较5个数值最小的数,完全比较后将最小的放入第一位,第二轮循环则是比较后4个(即坐标从第二个开始),找出最小的数字,与第二个位置交换。和冒泡排序以及简单的交换排序比起来,优势在于
移动数据少。
4、直接插入排序
直接插入排序的基本操作是将一个记录插入到已经排序好的有序表中,从而得到一个新的、记录数增1的有序表
当数据较少或记录本上基本有序时,直接插入排序优势明显
5、希尔排序
希尔排序是通过相隔某个“增量”来组成一个子序列,来实现一个跳跃式的移动,使得效率提高。
增量: increment = length; increment = increment / 3 + 1
6、堆排序
6.1 定义
堆是具有下列性质的完全二叉树 : 每个结点的值都大于或等于其左右孩子结点值,称为大顶堆;每个结点的值都小于或者等于其左右孩子结点的值,称为小顶堆。
6.2算法
假设利用大顶堆,将待排序的序列构造成一个大顶堆。此时,整个序列的最大值就是堆顶的根结点。将它移走(与末尾元素交换,此时末尾元素为最大),然后将剩余序列重新构成一个堆,反复执行。难点在于将数组调整为大顶堆数组。
7、归并排序
原理:假设初始序列含有 n 个记录,则可以看成是 n 个有序的子序列,每个子序列的长度为 1,然后两两归并,得到[n/2]个长度为2或1的有序子序列;再两两归并。
难点:理解两个数组合并的代码,理解递归
8、快速排序
通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序。
难点:选取关键字的方法,然后递归实现。
优化点:1、优化选取中枢 2、优化不必要的交换 3、优化递归操作 4、排序方案
个人实现代码:https://github.com/xu509/Java-practise/blob/master/src/SearchAndSort/SortFactory.java