Java排序

来源:互联网 发布:什么是网络群众路线 编辑:程序博客网 时间:2024/06/06 18:43

一 插入排序

1 直接插入排序

直接插入排序是一种简单的插入排序法,其基本思路是:把待排序的记录按其关键字的大小逐个插入到一个已经排序好的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。

 


分析算法:为了正确插入第i个记录,最多比较i次,最少比较1次,平均比较i/2次,从i=1到n-1的i/2的求和 约等于n^2,所以时间复杂度为O(n^2a)  空间复杂度为只需一个记录单元的辅助空间 O(1)。

2 希尔排序

希尔排序又称之为“缩小增量排序” 基本思路是:选的第一个增量d1<n,把全部记录按照此值从第一个记录起进行分组,所以相距为d1的记录为一组。先在各组内进行插入排序,然后减小间隔取第二个增量,d2<d1直到di=1为止。



分析算法:d较大时 ,被移动的记录是跳跃式践行的 到最后一趟时,不需要移动太多,平均移动次数是n^1.3 希尔排序是一种不稳定的排序
二 交换排序
1  冒泡排序
冒泡排序也称起泡排序,通过相邻的记录两两比较交换,使关键字较小的记录像水中的气泡一样逐趟向上漂浮,关键字大的往下沉。
基本思路:先将第一个记录的关键字和第二个进行比较,若为逆序,则交换位置,然后第二个再和第三个比较,如此下去,直到n个记录和n-1个记录的关键字进行比较完为止,这样就完成了第一趟冒泡排序,关键字最大的数安置在n的位置,然后进行第二趟排序,其结果是关键字最大的数放在n-1位置上,对n个记录的文件需要进行n-1次趟冒泡排序。

算法分析:时间复杂度O(n^2)
2 快速排序
快速排序是对冒泡排序的一种改进,快速排序的基本思想:在待排序的n个记录中任选一个记录,通常去取第一个记录,以该记录的关键字值为基准,用交换的方法将所有记录分为两部分,所有关键字比它小的记录均排在前面,关键字大的均排在它之后,这样就完成了一趟排序,然后对所分的前后两部分分别重复上面的操作,直到每部分内只有一个记录为止,排序结束。

算法分析:平均时间复杂度O(nlog2n)最坏的时间复杂度o(n^2)

三 选择排序
1 简单选择排序
选择排序是指每次从待排序的记录中选出关键字小的记录,顺序放在已排序的有序序列中,基本思想:对待排序文件进行n-1趟扫描,每次扫面选出最小值与第一个位置的数交换,依次类推 ,直到最后一个数和倒数第二个数

算法分析:时间复杂度O(n^2)
2 堆排序
堆排序是简单选择排序的改进,因为简单选择排序需要第一次做n-1次比较,然后n-2次比较...所以为了避免重复的比较。可以采用树形选择排序
基本思路:对一组待排序的记录序列,先将其关键字按堆得定义排列成一个序列(称初建堆),找到了最大最小关键字,将其取出,用剩余的n-1个元素在重建堆,便可找到最小最大值,直到排序完成。
算法分析  :时间复杂度O(nlogn)

四 归并排序
归并排序是另一种类型的排序方法,归并就是把两个或者两个或者多个有序表进行并合,得到新的有序表,将两个有序子文件合并成一个有序文件成为二路归并。当然,也有三路归并或者多路归并。基本思想:归并 分治  归并的基本思想是比较各个有序表的第一个记录的关键字的值,找出最小的第一个作为排序后的第一个记录的值 ,取出这个记录存入表中 ,依次类推,
时间复杂度为O(nlog2n)
五 基数排序
基数排序是和前面几种排序完全不同的一种排序方式。基数排序不需要进行关键字比较,而是各位值比较,根据优先位进行比较 。
基本思想: 把待比较值 设为统一的数位长度  数位短的前面补零,然后 从最低位各位开始依次进行排序  任何比较十位  最后比较最高位  然后数列变为一个有序序列

结论:
1 从平均时间上来说快速排序最快 但在最坏情况下不如堆排序跟归并排序。
2 从算法简单性看,不如选择排序 插入排序
3 从稳定性上看 直接插入排序 冒泡排序 和归并排序 是稳定的  而希尔排序 直接选择排序 快速排序 堆排序 是不稳定的
4 从待排序的记录数n的大小看 n小时 采用简单排序 n大时 采用改进排序






0 0