Q: 冒泡排序?

A: 
1) 比较相邻的元素。如果第一个比第二个大,就交换它们两个; 
2) 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数; 
3) 针对所有的元素重复以上的步骤,除了最后一个。因此总共有N - 1 趟; 
4) 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

Q: 冒泡排序的Java代码?

A: 示例: BubbleSort.java, BubbleSortTest.java

Q: 冒泡排序的不变性?

A: 在许多算法中,有些条件在算法执行时是不变的,这些条件被称为不变性。识别不变性对算法很有用,在一定情况下对调试也很有用:可以反复地检查不变性是否为真,如果不是的话就标记出错。

A: 在BubbleSort.java程序中,不变性是指i右边的所有数据项为有序。在算法的整个运行过程中这个条件始终为真。(在第一趟排序开始前,尚未排序,因为i开始时在数据项的最右边,没有数据项在i的右边。)

Q: 冒泡排序的效率?

A: 一般来说,数组中有N个数据项,则第一趟排序中有N - 1次比较,第二趟中有N - 2次,以此类推,总共用N - 1趟。这种序列的求和公式如下:

(N - 1) + (N - 2) + ... + 1 = (N - 1) * N / 2

这样算法大约N/ 2次比较,如果数据是随机的,那么大概有一半数据需要交换,则交换的次数为N2 / 4。因此交换和比较操作次数都和N2成正比。由于常数不算在大O表示法中,可以忽略2和4,并且认为冒泡排序运行需要O(N2)时间级别。

无论何时,只要看到一个循环嵌套在另一个循环里,都可以怀疑这个算法的运行时间为O(N2)级。

Q: 选择排序?

A: 选择排序改进了冒泡排序,将必要的交换次数从O(N2)较少到O(N),不幸的是比较次数仍保持O(N2)。然而这也是一个重大的改进,因为大量的记录在内存中移动,使得交换所需CPU时间比比较所需的CPU时间多。(一般来说,Java语言不是这种情况,Java只是改变了引用位置,而实际对象的位置并没有发生改变。)

Q: 选择排序的Java代码?

A: 示例: SelectSort.java, SelectSortTest.java

Q: 选择排序的不变性?

A: 在SelectSort.java程序中,下标小于或等于i的位置的数据项总是有序的。

Q: 选择排序的效率?

A: 选择排序和冒泡排序执行了相同次数的比较:N * (N - 1) / 2。然而交换次数,最好情况是,已经有序交换0次,最坏情况交换n-1次。

A: 当N值较大时,比较次数是主要的,所以结论是选择排序和冒泡排序一样运行了O(N2)时间,但是选择排序无疑更快,因为它进行的交换少的多。

A: 当N值较小时,特别如果交换的时间级比比较的时间级大的多时,选择排序实际上是相当快的。

Q: 插入排序?

A: 在大多数情况下,插入排序算法是本篇描述简单排序算法中最快的一种,虽然插入排序算法仍然需要O(N2)的时间,但是在一般情况下,它要比冒泡排序快一倍,比选择排序还要快一点。 尽管它比冒泡排序和选择排序算法要麻烦一些,但它并不复杂。

Q: 插入排序的Java代码?

A: 示例: InsertSort.java, InsertSortTest.java

Q: 插入排序的不变性

A: 在每趟结束时,在将tmp位置的项插入后,比i变量下标小的数据项都是局部有序的。

Q: 插入排序的效率?

A: 在第一趟排序中,它最多比较一次,第二趟最多比较两次,以此类推,最后一趟最多比较N - 1次,因此有最坏的情况为1 + 2 + 3 + ... + (N - 1) = N * (N - 1) / 2。

A: 然而,因为在每一项排序发现插入点之前,平均只有一半在进行比较,因此我们还要除以2,即N * (N - 1) / 4。

A: 对于已经有序的数据来说,插入排序要好的多。当数据有序时,while循环循环的条件总是假,所以它变成了外部循环的简单语句,执行了N - 1次,在这种情况下,算法运行只需要O(N)的时间。

Q: 给对象进行排序?

A: 为简单起见,前面应用排序算法使用基本数据类型long,但是实际场景中却更多地应用对象的排序,因此下面的程序,是对一组Person对象进行排序的代码。

示例: ObjectArray.java, ObjectArrayTest.java

Q: 几种简单排序之间的比较?

A: 除非手边没有算法书可参考,一般情况下几乎不太使用冒泡排序。它过于简单,以至于可以毫不费力地写出来,然而当数据量很小的时候它会有些应用价值。

A: 选择排序虽然把交换次数降到了最低,但比较的次数仍然很大。当数据量很小,并且交换数据相对于比较数据更加耗时的情况下,可以应用选择排序。

A: 在大多数情况下,假设当数据量比较小或基本有序时,插入排序算法是三种简单排序算法中最好的选择。

A: 除了在速度方便比较排序算法外,还有一种对各种算法的衡量标准是算法需要的内存空间有多大。本篇的三种算法除了初始化数组外几乎不需要其他内存的空间,只是需要一个额外的变量来暂时存储交换时的数据项。

A: 下面的示例是对100万条long数据进行升序排序,数据源是随机、降序和升序的数据集合。表格给出了每个算法的执行的时间,单位是纳秒。

排序算法 随机 降序 升序
冒泡排序 16,596,040,573 892,914,054,225 2,464,119,746
选择排序 4,398,524,493 485,797,197,595 4,441,700,179
插入排序 1,620,718,024 420,773,500,477 5,189,851

示例: LongArray.java, LongArrayTest.java

 

Q: 参考?

    1. 《Java数据结构和算法》Robert Lafore 著,第3章 - 简单排序
    2. 冒泡排序

    3. 选择排序

    4. 插入排序

Java数据结构和算法 - 简单排序的更多相关文章

  1. Java数据结构和算法 - 高级排序

    希尔排序 Q: 什么是希尔排序? A: 希尔排序因计算机科学家Donald L.Shell而得名,他在1959年发现了希尔排序算法. A: 希尔排序基于插入排序,但是增加了一个新的特性,大大地提高了插 ...

  2. Java数据结构与算法之排序

    排序从大体上来讲,做了两件事情: 1.比較两个数据项: 2.交换两个数据项.或复制当中一项 一.冒泡排序 大O表示法:交换次数和比較次数都为O(N*N). 算法原理: 1.比較相邻的元素.假设第一个比 ...

  3. java数据结构和算法------希尔排序

    package iYou.neugle.sort; public class Shell_sort { public static void ShellSort(double[] array) { i ...

  4. java数据结构和算法------选择排序

    package iYou.neugle.sort; public class Select_sort { public static void SelectSort(double[] array) { ...

  5. java数据结构和算法------合并排序

      package iYou.neugle.sort; public class Merge_sort { public static void MergeSort(double[] array, i ...

  6. Java数据结构和算法(九)——高级排序

    春晚好看吗?不存在的!!! 在Java数据结构和算法(三)——冒泡.选择.插入排序算法中我们介绍了三种简单的排序算法,它们的时间复杂度大O表示法都是O(N2),如果数据量少,我们还能忍受,但是数据量大 ...

  7. Java数据结构和算法(五)--希尔排序和快速排序

    在前面复习了三个简单排序Java数据结构和算法(三)--三大排序--冒泡.选择.插入排序,属于算法的基础,但是效率是偏低的,所以现在 学习高级排序 插入排序存在的问题: 插入排序在逻辑把数据分为两部分 ...

  8. Java数据结构和算法(三)--三大排序--冒泡、选择、插入排序

    三大排序在我们刚开始学习编程的时候就接触过,也是刚开始工作笔试会遇到的,后续也会学习希尔.快速排序,这里顺便复习一下 冒泡排序: 步骤: 1.从首位开始,比较首位和右边的索引 2.如果当前位置比右边的 ...

  9. Java数据结构和算法 - 堆

    堆的介绍 Q: 什么是堆? A: 这里的“堆”是指一种特殊的二叉树,不要和Java.C/C++等编程语言里的“堆”混淆,后者指的是程序员用new能得到的计算机内存的可用部分 A: 堆是有如下特点的二叉 ...

随机推荐

  1. Vue路由学习心得

    GoodBoy and GoodGirl~进来了就看完点个赞再离开,写了这么多也不容易的~ 一.介绍  1.概念:路由其实就是指向的意思,当我们点击home按钮时,页面中就要显示home的内容,点击l ...

  2. 关于Google 圆角 高光 高宽 自适应 按钮

    最近看了张鑫旭老师关于Google搜索按钮的博客,感觉启示颇多.下面我就详说一下这个按钮的代码,由于W3C新版本的更新,之前的代码会有部分累赘, 在此,我做了些修改.当然,想观摩原版的可以,狠狠的戳链 ...

  3. CSS透明opacity和IE各版本透明度滤镜filter的准确用法

    滤镜名    说明 Alpha     让HTML元件呈现出透明的渐进效果Blur     让HTML元件产生风吹模糊的效果Chroma     让图像中的某一颜色变成透明色DropShadow    ...

  4. Dubbo中消费者初始化的过程解析

    首先还是Spring碰到dubbo的标签之后,会使用parseCustomElement解析dubbo标签,使用的解析器是dubbo的DubboBeanDefinitionParser,解析完成之后返 ...

  5. 将外部dwg图纸中指定带属性的块插入到当前图纸中

    static void InsertBlock() { //获取要插入的块名 TCHAR str[40]; acedGetString(Adesk::kFalse, _T("\n请输入要插入 ...

  6. Nordic nRF51/nRF52开发流程说明

    Nordic nRF51系列包括nRF51822/nRF51422/nRF51802等芯片,nRF52系列包括nRF52832/nRF52840/nRF52810等芯片,硬件工程师可以按照如下流程去评 ...

  7. 【数学建模】【APIO2015】Palembang Bridges

    Description 一条东西走向的穆西河将巴邻旁市一分为二,分割成了区域 A 和区域 B. 每一块区域沿着河岸都建了恰好 1000000001 栋的建筑,每条岸边的建筑都从 0 编号到 10000 ...

  8. BZOJ_2038_[2009国家集训队]小Z的袜子(hose)_莫队

    BZOJ_2038_[2009国家集训队]小Z的袜子(hose)_莫队 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无 ...

  9. sublime text3简体中文版汉化教程

    今天突然想到好像还有一个强大的编译器sublime text 3可是这个是外国的编译器,不过各位不用担心 这个编译器,已经支持中文编译了: 下面就是我关于汉化为中文方面的一些了解以及汉化方式(由于我的 ...

  10. C++的代理类

    怎样在一个容器中包含类型不同,但是彼此有关系的对象?众所周知,C++的容器只能存放类型相同的元素,所以直接在一个容器中存储不同类型的对象本身是不可能的,只能通过以下两种方案实现: 1. 提供一个间接层 ...