1. 冒泡与选择排序及其比较

冒泡排序

1. 思想

  冒泡排序(Bubble Sort)是一种交换排序,基本思路是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止

 

2. 实现

2.1 初学常用的一种

public static <T extends Comparable<? super T>> void BubbleSort(T[] a) {int length = a.length;for (int i = 0; i < length; i++) {for (int j = i+1; j < length; j++) {if (a[i].compareTo(a[j]) > 0) {Object obj = a[i];a[j] = a[i];a[i] = (T)obj;} // end if} // end for} // end for
} // end BubbleSort

  缺陷:每一次内循环结束时,对其余的关键字没有帮助,甚至把原来靠近正确排序位置的记录交换到较远的地方。即,算法是低效的。

 

 

2.2 正宗的冒泡排序

public static <T extends Comparable<? super T>> void BubbleSort(T[] a) {int length = a.length;for (int i = 0; i < length - 1; i++) {for (int j = length - 2; j >= i; j--) {if (a[j].compareTo(a[j+1]) > 0) {Object obj = a[i];a[i] = a[j];a[j] = (T)obj;} // end if} // end for} // end for
} // end BubbleSort

  

  显然这一算法比之前的实现要有效,图中较小的数字如同气泡慢慢浮到上面,因此将此算法命名为冒泡排序。 

 

2.3 冒泡排序的优化

  对于已经有序或接近有序的集合时,会进行很多次不必要的循环比较,为此,需要改进实现,设置一个flag记录在一次循环比较中是否有交换操作,如果没有说明集合已经有序。

public static <T extends Comparable<? super T>> void BubbleSort(T[] a) {int length = a.length;boolean flag = true;  // 用flag作为标记for (int i = 0; (i < length - 1) && flag; i++) {flag = false;for (int j = length - 2; j >= i; j--) {if (a[j].compareTo(a[j+1]) > 0) {Object obj = a[i];a[i] = a[j];a[j] = (T)obj;flag = true;     // 有数据交换则为true} // end if} // end for} // end for
} // end BubbleSort

 

2.4 冒泡排序复杂度分析

  最好的情况下,也就是数组有序时,根据最后改进的代码,需要比较n-1次关键字,没有数据交换,时间复杂度为O(n)最坏的情况下,即待排序记录全为倒序,此时比较1+2+3+4+…+(n-1) = n(n-1)/2次,并作等数量级的记录移动。所以时间复杂度为O(n2)。

 

简单选择排序

1. 思想

  冒泡排序的思想就不断地在交换,通过交换完成最终的排序。这种方式太繁琐,可不可以在确定位置的时候在交换,减少交换操作,完成只交换一次就完成相应关键字的排序定位?这就是选择排序的初步思想。

 

2. 排序算法

  简单选择排序Simple Selection Sort)就是通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1 ≤ i ≤ n)个记录交换。

// simple selection sort
public static <T extends Comparable<? super T>> void SelectSort(T[] a) {int length = a.length;for (int i = 0; i < length - 1; i++) {int min = i;for (int j = i+1; j < length; j++) {if (a[min].compareTo(a[j]) > 0) {min = j;} // end if} // end forif (i != min) {Object obj = a[min];a[min] = a[i];a[i] = (T)obj;} // end if} // end for
} // end SelectSort

 

3. 简单选择排序复杂度分析

  从简单选择排序过程看,最大的特点是减少了移动数据的次数,这样节约了时间。无论最好还是最差的情况下,比较次数都是一样的,i趟要比较n-i次关键字,共需要比较(n-1)+(n-2)+…+2+1=n(n-1)/2次,最好情况下,即有序时,交换0次,最坏情况下,即逆序时,交换n-1次。最终排序时间为比较和移动的总和,时间复杂度为O(n2)。

尽管与冒泡排序同为O(n2),但简单选择排序的性能还是要略优于冒泡排序。(下列比较缺不是!)

 

冒泡与选择排序对比

import java.util.Arrays;
/*** sort for Array* @author Administrator*/
public class Sort {// 非标准的冒泡排序,最简单的交换排序!(让每一个关键字,都和它后面的每一个关键字比较,如果大则交换)public static void BubbleSort1(int[] a) {int length = a.length;for (int i = 0; i < length; i++) {for (int j = i+1; j < length; j++) {if (a[i] > a[j]) {int obj = a[i];a[i] = a[j];a[j] = obj;} // end if} // end for} // end for} // end BubbleSort//  标准冒泡排序public static void BubbleSort2(int[] a) {int length = a.length;for (int i = 0; i < length - 1; i++) {for (int j = length - 2; j >= i; j--) {if (a[j] > a[j+1]) {int obj = a[j];a[j] = a[j+1];a[j+1] = obj;} // end if} // end for} // end for} // end BubbleSortpublic static void BubbleSort3(int[] a) {int length = a.length;boolean flag = true;  // 用flag作为标记for (int i = 0; (i < length - 1) && flag; i++) {flag = false;for (int j = length - 2; j >= i; j--) {if (a[j] > a[j+1]) {int obj = a[j];a[j] = a[j+1];a[j+1] = obj;flag = true;     // 有数据交换则为true} // end if} // end for} // end for} // end BubbleSort// simple selection sortpublic static void SelectSort(int[] a) {int length = a.length;for (int i = 0; i < length - 1; i++) {int min = i;for (int j = i+1; j < length; j++) {if (a[min] > a[j]) {min = j;} // end if} // end forif (i != min) {int obj = a[min];a[min] = a[i];a[i] = obj;} // end if} // end for} // end SelectSortpublic static void main(String[] args) {// 随机生成50000、50_0000的整数int[] a = new int[50_0000];for (int i = 0; i < a.length; i++) {a[i] = (int)(Math.random() * 500);//System.out.print(a[i] + " ");}// System.out.println();// 保证各个排序算法使用的数据一样int[] a2 = Arrays.copyOf(a, a.length);int[] a3 = Arrays.copyOf(a, a.length);int[] a4 = Arrays.copyOf(a, a.length);
Date d1
= new Date();BubbleSort1(a); // 最常用的初学实现 50000:919,962,1032 500000:59425,60701,59811System.out.println(new Date().getTime() - d1.getTime());Date d2 = new Date();BubbleSort2(a2); // 标准冒泡 50000:5332,5300,5957 500000:491104,480838,478621System.out.println(new Date().getTime() - d2.getTime());Date d3 = new Date();BubbleSort3(a3); // 改进冒泡 50000: 5477,5648,5696 500000:526451,522458,503981System.out.println(new Date().getTime() - d3.getTime());Date d4 = new Date();SelectSort(a4); // 50000: 1118,1256,1076 500000:107144,95680,94796System.out.println(new Date().getTime() - d4.getTime());} } // end Sort

  可以看出对于随机数组,常用的冒泡性能最好,接下来是简单选择排序,标准冒泡和改进的冒泡效率不如初学常用的冒泡高。改进的冒泡排序适合于接近有序或已经有序的情况。

转载于:https://www.cnblogs.com/datamining-bio/p/9715774.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/570384.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

photoshop切图

1.传统切图 &#xff08;1&#xff09;打开一个psd文件&#xff0c;选择ps左边菜单栏的裁剪工具&#xff0c;选择切片工具。首先我们对这个psd文件进行分析&#xff0c;有意识的将其划分成几个选区&#xff0c;然后通过鼠标的拖拽用切片工具将我们所需要的图案切下来&#xff0…

怎么在cmd中进入D盘下的文件夹

从cmd中进入D盘&#xff0c;在光标处输入“d:”(大小写都可以)&#xff0c;按enter进入。 进入D盘根目录后&#xff0c;如果想找到work文件夹可以在光标处输入“cd work”即可。

linux文件管理 - 系统目录结构

几乎所有的计算机操作系统都是用目录结构组织文件。具体来说就是在一个目录中存放子目录和文件, 而在子目录中又会进一步存放子目录和文件&#xff0c;以此类推形成一个树状的文件结构&#xff0c;由于其结构很像一棵树的分支, 所以该结构又被称为“目录树”。 Linux系统中也沿…

BRVAH(让RecyclerView变得更高效)(1)

本文来自网易云社区作者&#xff1a;吴思博对于RecyclerView&#xff0c; 我们重复编写着那一个又一个的列表界面&#xff0c;有的要分组&#xff0c;有的要添加广告头部、有的要不同类型item排列、等等需求&#xff0c;主要代码有大部分是重复的&#xff0c;如果有一个框架能够…

PyQt5菜单添加+事件+状态栏-7

1 from PyQt5.QtWidgets import QApplication,QMainWindow,QAction2 from PyQt5.QtGui import QIcon3 #demo_7:菜单添加action以及状态栏显示消息4 import sys5 class Example(QMainWindow):6 def __init__(self):7 self.app QApplication(sys.argv)8 sup…

git命令图片

转载于:https://www.cnblogs.com/duanwandao/p/9734074.html

解题: SDOI 2011 染色

题面 强行把序列问题通过树剖套在树上。。。算了算是回顾了一下树剖的思想。 每次树上跳的时候注意跳的同时维护当前拼出来的左右两条链的靠上的端点&#xff0c;然后拼起来的时候讨论一下拼接点&#xff0c;最后一下左右两边的端点都要考虑 1 #include<cstdio>2 #includ…

java.lang.OutOfMemoryError: PermGen space

使用Tomcat报java.lang.OutOfMemoryError: PermGen space错误时&#xff0c;这是tomcat的内存不够的原因&#xff0c;也就是tomcat的内存溢出。 这是我们只要在tomcat的配置下添加服务内存就可以了&#xff0c;添加内存方法&#xff0c;只要加入 -Xms256M -Xmx512M -XX:PermS…

怎么把jad反编译放到Eclipse中

可以在CSDN下载页上进行下载哦&#xff0c;免费的哦&#xff0c;不要积分。 http://download.csdn.net/detail/farxix/9838195 我们把下载下来的jad资源包解压出来&#xff0c;如下图&#xff1a; 首先&#xff1a; 然后&#xff1a; 打开eclipse进行设置&#xff0…

一些很有意思的JS现象

关于JS对象的 . 和 [] []除了属性名可以比 .天马行空以外(比如我们要添加一个为33-abc的属性&#xff0c;一定得用[]))&#xff0c;还有一个实际操作中的区别 Object.is的作用和两个奇特的现象 还记得isNaN的作用&#xff0c;但有时候我们就想直接比较两个数据&#xff0c;总不…

怎么查看eclipse的版本号

在电脑上找到你安装eclipse的路径&#xff0c;找到readme点击打开&#xff0c;如下图所示&#xff1a; 查看版本号&#xff1a;

Vue2.0 脚手架代码详解

参考作者&#xff1a;https://www.jianshu.com/p/2b661d01eaf8 只是为了方便个人学习。 来看一下脚手架创建后的项目目录 说明&#xff1a;在*.vue文件&#xff0c;template标签里写html代码&#xff0c;且template直接子级只能有一个标签。style标签里写样式&#xff0c;scrip…

如何使用多个端口访问tomcat

查端口号是否被占用 在cmd中使用 netstat -ano 命令&#xff1b; 处理端口号使用命令 taskkill /pid 1234 ( 8080指的是端口号对应的PID 号 ) 在使用tomcat服务器做为开发使用时&#xff0c;如果我们有多个项目要发布、启动时怎么办呢&#xff0c;在一个tomcat下添加多个项目…

win10 安装mysql 8.0.12

按照CSDN以及博客园的其他教程, 之前安装过几次都有或多或少的bug 主要安装步骤: 1.配置my.ini文件 2.管理员进入终端, 切换到.../bin目录下进行操作 3.指令操作: 1) mysqld --initialize --console              此指令正常情况下, 可以自动生成一项随机密码, 一…

查看端口占用情况

当tomcat被占用时&#xff0c;可以使用命令行来解决占用问题&#xff1b; 打开cmd 输入netstat -ano|findstr 7001 即可找到相应的pid号 7016 再使用taskkill /f /pid 7016 就可以去除占用端口号情况。

译:1. RabbitMQ Java Client 之 Hello World

这些教程介绍了使用RabbitMQ创建消息传递应用程序的基础知识。您需要安装RabbitMQ服务器才能完成教程 1. 打造第一个Hello World 程序 RabbitMQ是一个消息代理&#xff1a;它接受和转发消息。你可以把它想象成一个邮局&#xff1a;当你把你想要发布的邮件放在邮箱里时&#xff…

基于SpringBoot 2.0正式版的SpringCloud的微服务实战项目搭建

Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具&#xff0c;它为基于JVM的云应用开发中的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单的开发方式。 Spring Cloud包含…

structc 开源框架介绍

引言 - 一切才刚刚开始 structc 是 C 结构基础库. 简单可复用. structc - https://github.com/wangzhione/structc 之前也描述过几次 structc, 文字多代码风格少. 最近加班不多, 准备详细解说哈其思考初衷. 0.0 整体结构 structc ├── extern ├── LICENSE ├── Makefil…

CSS颜色

CSS的颜色可以通过以下方法指定&#xff1a; 十六进制颜色RGB颜色RGBA颜色HSL色彩HSLA颜色 十六进制颜色 指定一个十六进制的颜色其组成部分是&#xff1a;#RRGGBB&#xff0c;其中RR&#xff08;红色&#xff09;&#xff0c;GG&#xff08;绿色&#xff09;和BB&#xff08;蓝…

CAN总线(1)--初探(更新中)

前言&#xff1a; CAN总线可以控制可以使用Xilinx中IP核来直接实现&#xff0c;也可以使用专用的CAN芯片&#xff08;例如&#xff1a;SJA1000&#xff09;通过单片机和FPGA驱动控制来实现&#xff1b; 目前是使用控制器SJA1000来进行实现&#xff1b; CAN总线控制器-SJA1000 结…