多种排序算法的比较

1.冒泡排序和选择排序

为什么把冒泡排序和选择排序放在一块儿呢?因为我发现他们两个有点像。

冒泡排序是不停的把最大的元素换到数组的最右端。

而选择排序是把最小的元素换到最左端。

看到这儿,你是不是觉得冒泡和选择好像没啥区别啊,把最大换成最小就成了一种新的算法?那我也来一个?

其实,无论换最大还是最小,都无关紧要,就算冒泡变成换最小的元素换到数组的最左端,那它也叫冒泡排序的。

冒泡排序的描述:它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到不需要交换,也就是说该数列已经排序完成。

选择排序的描述:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。

为了便于描述二者之间的区别,我们把冒泡和排序都换成是把最大元素换到最右端。

他们的最大区别在于

冒泡排序不停比较两个相邻的元素,并不断交换较大的元素,直到数组尾。

选择排序开始只比较不交换,直到数组尾才进行一次交换。

在这里,你可以认为选择排序是冒泡排序的优化,因为选择排序多数时候减少了交换的次数,却实现了相同的效果。

难道冒泡排序多做的那些交换就全是无用功吗?仔细想想,当然不是这样!

仔细看看冒泡排序是怎么说的,“走访数列的工作是重复地进行直到不需要交换”,这个很重要,假如我们加入一个变量,来记录交换次数,当某趟遍历交换次数为零的时候,说明数组已经排序好了,那就可以结束排序了!

比如“1,2,3,4,5,6,7,8,9”,对于这样一个数组,冒泡排序只需要进行一次遍历就ok了,所以对于基本有序的数组,冒泡可以做到O(n)的复杂度。

但是选择排序做不到这一点,一个已经有序的数组和随机排列的数组将花差不多的时间(稍微会少点,因为有序数组不需要交换,只需要比较)。

在这里,我们发现,选择排序并没有利用数组的初始输入状态,而冒泡排序利用了。这是冒泡的优势,在这里,你可能会想,冒泡是如何利用初始状态的呢?当然就是在一次又一次相邻元素的比较上嘛。

最后,由于选择排序会交换不相邻元素,比如直接把a[0]和a[8]交换位置,导致了选择排序的不稳定。而冒泡只会交换相邻元素,所以冒泡是稳定的,我们当然不会蠢到a[0]=1,a[1]=1的时候交换他们的位置是吧。

待会儿我们会分析插入排序和希尔排序,这两个排序的稳定性的因果分析也和是否交换不相邻元素有关。

先到这儿,明天再写。。

多种排序算法的比较

时间: 2024-11-05 13:46:49

多种排序算法的比较的相关文章

多种排序算法的思路和简单代码的实现(一)

就自己简单的理解了一些排序算法(JAVA)思路和代码分享给大家:欢迎大家进行交流. 直接插入排序,折半插入排序,冒泡排序,快速排序 1 public class Sort { 2 /* 3 * 直接插入排序: 先确定一个有序数组,然后把插入的数与有序数组从最后依次进行比较, 直到插入的数比有序数组的数大,此数换为插入的数字,从此位置以后 4 * 的数依次向后移动一位. 5 */ 6 public static void insert(int[] a) { 7 for (int i = 1; i

多种排序算法

插入排序 已经有一个排好的序列,要将新元素放到序列合适的位置. int *InsertSortA(int *R,n) { int i,j; for(j=1;j<n;j++) { i=j-1; tmp=R[j]; while(i>=0&&R[i]<tmp) { R[i+1]=R[i]; i--; } R[i+1]=tmp; } return R: } 上述算法中每次都要判断i是否小于0,可以让数组第一个元素是一个很小的值,使得R[0]<min{Ri},i为1到n,整个

多种排序算法整理

最近面试一直问到排序,老是各种搞混,特地来整理整理 先盗用一张图: 说明: 内部排序基于内存,外部排序是数据量大,而内存与外存的相结合的排序 一.插入排序 关键词:插入,将数字插入到一条已经排好序的有序表中. 1.1直接插入排序 假设要5,4,2,3,1 要升序排列. i=1 5 i=2 5,4    ==>4,5 i=3 4,5,2 ===>2,4,5 i=4 2,4,5,3 ==>2,3,4,5 ... 思想很简单,就是从一个元素开始,一个个元素添加,返回有序列表. 其复杂度为  

多种排序算法的思路和简单代码的实现(三)

下面是和快速排序,堆排序,相媲美的归并排序,时间复杂度都为O(nLog2n). 对于归并排序中出现的递归算法,调用的函数顺序以及如何返回,大家可以访问这个网址来详细理解 http://blog.csdn.net/cinderella_hou/article/details/51763681 个人看了,非常受益.. 1 /* 2 * 归并排序: 先递归分解数列,再合并数列,就是归并.归并排序是稳定的. 3 */ 4 public static void mergSort(int[] a) { 5

初探几种排序算法

多种排序算法的总结(不包括复杂度的详细推算) 稳定排序与不稳定排序 稳定排序:相同元素在排序中的相对位置不改变. 不稳定排序:相同元素在排序中的相对位置改变. 内部排序与外部排序: 内部排序:待排的记录与内容都放在计算机的随机存储器中进行的排序过程 外部排序:一般指待排序记录的数量很大,以致内存中一次不能完全容纳全部的记录,在排序过程中,需要对外存进行访问的排序过程. 排序算法的复杂度: 在此我们一般只要考虑的就是时间复杂度,当然个别排序的空间复杂度也很大,如希尔排序.这里时间复杂度的计算方法和

数据结构实践——大数据集上排序算法性能的体验

本文是针对[数据结构基础系列(9):排序]的实践项目. [项目 - 大数据集上排序算法性能的体验] 设计一个函数,产生一个至少5万条记录的数据集合.在同一数据集上,用直接插入排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序等算法进行排序,记录所需要的时间,经过对比,得到对复杂度不同的各种算法在运行时间方面的感性认识. 提示1:这一项目需要整合多种排序算法,可以考虑先建设排序算法库,作为我们这门课算法库的收官之作: 提示2:本项目旨在获得对于复杂度不同算法的感性认识,由于数据分布

排序算法进阶--排序算法优化

排序算法进阶 上篇文章中我们主要介绍了经典的八大排序算法,从算法思想,动图演示,代码实现,复杂度及稳定性分析等角度进行学习.还没阅读的童鞋可以点这里进行浏览. 求知若渴的你肯定不会满足于入门的内容,今天,小编在上一篇的基础上,对多种排序算法进行优化,让我们一起来康康吧~~ 01冒泡排序 1. 优化一 优化思路:优化外层循环,我们知道,冒泡排序的每一轮都会对未排序部分进行一次遍历,如果在某次循环中没有交换操作,就说明数组已经有序,不用继续排序. 实现代码 1 public static int[]

排序算法比较及其应用

一.将各种数据排序 只要实现了Comparable接口的数据类型就可以被排序. 但要使算法能够灵活地用不同字段进行排序,则是后续需要考虑的问题. 1.指针排序 在Java中,指针操作是隐式的,排序算法操作的总是数据引用,而不是数据本身. 2.键不可变 如果在排序后,用例还可以改变键值,那么数组很可能就不是有序的了.类似,优先队列也会乱套. Java中,可以用不可变数据类型作为键来避免这个问题,如String,Integer,Double和File都是不可变的. 3.廉价交换 使用引用的另一个好处

排序算法总结

各种排序算法总结  排序算法  插入排序 冒泡排序  选择排序  归并排序  快速排序 堆排序  计数排序  基数排序  桶排序  思想  构建有序序列 两两交换 每次找一个最小值 分治法思想 分治法思想 最小堆.最大堆 数字本身的属性  对数据选择多种基数  函数的映射关系.Hash  数据结构  数组  数组  数组  数组 不定   数组 数组 数组  数组  最差时间复杂度 O(n^2)   O(n^2)   O(n^2)   O(n*lgn)  O(n^2).改进O(n*lgn)  O