http://blog.csdn.net/weixin_37720904/article/details/77982525
本篇博客知识点
分别描述了 冒泡,选择,直接插入,二分插入,希尔,快速以及归并排序。同时还有Java实现代码,算法分析和示意图
冒泡排序
算法描述
- 设待排序记录序列中的记录个数为n
- 一般地,第i趟起泡排序从1到n-i+1
- 依次比较相邻两个记录的关键字,如果发生逆序,则交换之。
- 其结果是这n-i+1个记录中,关键字最大的记录被交换到第n-i+1的位置上,最多作n-1趟。
算法实例
经过五趟可以将 21 25 49 25 16 08 排为由小到大的升序
其中,里面的每一趟的排序示意如下,以第一天49如何配到最后为例
每一趟的结果都是把未排序的最大的那个数字排到最后。
算法代码实现—Java代码实现
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
算法评价
- 时间复杂度:T(n)=O(n²)
- 空间复杂度:S(n)=O(1)
选择排序
算法描述
- 首先通过n-1次比较,从n个数中找出最小的, 将它与第一个数交换——第一趟选择排序,结果最小的数被安置在第一个元素位置上。
- 再通过n-2次比较,从剩余的n-1个数中找出关键字次小的记录,将它与第二个数交换——第二趟选择排序。
- 重复上述过程,共经过n-1趟排序后,排序结束。
排序实例
找到最小的数,把他放到前面去
算法代码实现—Java代码实现
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
算法评价
- 时间复杂度:T(n)=O(n²)
- 空间复杂度:S(n)=O(1)
3.1 直接插入排序
算法分析
- 关键字比较次数和记录移动次数与记录关键字的初始排列有关。
- 最好情况下, 排序前记录已按关键字从小到大有序, 每趟只需与前面有序记录序列的最后一个记录比较1次, 移动2次记录, 总的关键字比较次数为 n-1, 记录移动次数为 2(n-1)。在平均情况下的关键字比较次数和记录移动次数约为n² /4。
- 直接插入排序是一种稳定的排序方法
- 直接插入排序最大的优点是简单,在记录数较少时,是比较好的办法。
算法描述:
记录存放在数组R[0….n-1]中,排序过程的某一中间时刻,R被划分成两个子区间R[0…i-1]和R[i….n-1],其中:前一个子区间是已排好序的有序区;后一个子区间则是当前未排序的部分。
基本操作:
将当前无序区的第1个记录R[i]插入到有序区R[0….i-1]中适当的位置,使R[0…i]变为新的有序区。
操作细节:
- 1
- 2
算法实例: 21, 25, 49, 25*, 16, 08
实现代码
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
3.1 二分查找插入排序
算法描述:
- 在直接插入排序的基础上,利用二分(折半)查找算法决策出当前元素所要插入的位置。
- 在直接插入排序的基础上,利用二分(折半)查找算法决策出当前元素所要插入的位置。
- 找到当前元素的插入位置i之后,把i和high之间的元素从后往前依次后移一个位置,然后再把当前元素放入位置i。
算法实现:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
希尔入排序
- 1
算法描述
- 1
- 2
- 3
算法分析
- 开始时 gap 的值较大, 子序列中的元素较少, 排序速度较快。
- 随着排序进展, gap 值逐渐变小, 子序列中元素个数逐渐变多,由于前面大多数元素已基本有序, 所以排序速度仍然很快。
- 分组后n值减小,n²更小,而T(n)=O(n²),所以T(n)从总体上看是减小了。
- Gap的取法有多种。 shell 提出取 gap = n/2 ,gap = gap/2 ,…,直到gap = 1。gap若是奇,则gap=gap+1
运用实例
实现代码
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
快速排序
算法描述
- 任取待排序记录序列中的某个记录(例如取第一个记录)作为基准(枢),按照该记录的关键字大小,将整个记录序列划分为左右两个子序列
- 左侧子序列中所有记录的关键字都小于或等于基准记录的关键字
- 右侧子序列中所有记录的关键字都大于基准记录的关键字
- 基准记录则排在这两个子序列中间(这也是该记录最终应安放的位置)。
- 然后分别对这两个子序列重复施行上述方法,直到所有的记录都排在相应位置上为止。
- 1
算法特点:
- 以某个记录为界(该记录称为支点或枢轴),将待排序列分成两部分:
- 一部分: 所有记录的关键字大于等于支点记录的关键字
- 另一部分: 所有记录的关键字小于支点记录的关键字
算法实例
算法分析
- 快速排序是一个递归过程,快速排序的趟数取决于递归树的高度。
- 如果每次划分对一个记录定位后, 该记录的左侧子序列与右侧子序列的长度相同, 则下一步将是对两个长度减半的子序列进行排序, 这是最理想的情况
实现代码
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
算法评价
- 时间复杂度:
最好情况(每次总是选到中间值作枢轴)T(n)=O(nlogn)
最坏情况(每次总是选到最小或最大元素作枢轴)T(n)=O(n²)
- 空间复杂度:需栈空间以实现递归
最坏情况:S(n)=O(n)
一般情况:S(n)=O(logn)
快速排序 优化—前面实现版本
- 1
- 2
归并排序
算法描述:
- 1
- 2
- 3
算法实例
实现代码
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
算法分析:
- 1
- 2
算法评价
- 时间复杂度:T(n)=O(nlogn)
- 空间复杂度:S(n)=O(n)
总结