冒泡,选择,插入,快速排序在Java中的实现
近几天再重新看数据结构的书时,根据各种排序的空间复杂度,发现快速排序所用时间是最短的,也即是说快速排序的速度最快。因此想验证一下具体这几个排序发的快慢,所以在Java中得以实现,同时在运行时,发现虽然快速排序的速度很快,但是它所消耗的内存是最大的。这也说明了当我们追求速度时,也必须要付出其他方面的代价。以下是几种方法的具体实现,及其所消耗的时间。
首先在Java中随机生成20个1000以内的数,然后使用四种排序法分别进行排序,验证四种排序程序的无误,以下是具体结果:

通过以上结果证明四种排序方法均可以达到排序目的,以下是对四种排序法时间的测试,观看各个测试时间的长短,具体结果如下所示:




以上是对随机生成的10万个数进行排序时所需时间,从上显然可看出冒泡所需时间为27秒,选择排序为8秒,而插入排序为5秒,冒泡排序时间为0秒。所以冒泡是最慢的而选择居其次,快速排序是最快的。以下是具体代码:
/**
* 作者:曹家铭
* 日期:2016,4,7
* 功能:演示冒泡,选择,插入,快速排序的时间快慢程度比较
*/
package com.Paixu; import java.util.Calendar; public class Paixu { public static void main(String[] args) {
// TODO Auto-generated method stub int N=100000;
int arr[]=new int[N];
for(int i=0;i<N;i++)
{
int m=(int)(Math.random()*1000);
arr[i]=m;
}
Bubble bubble=new Bubble();
Select select=new Select();
Insert insert=new Insert();
Quick quick=new Quick();
Calendar calendar=Calendar.getInstance();//打印当前系统时间
//冒泡排序所用时间
System.out.println("冒泡排序前的时间为:"+calendar.getTime());
bubble.sort(arr);
calendar=Calendar.getInstance();
System.out.println("冒泡排序后的时间为:"+calendar.getTime());//打印排序后的时间*/
//选择排序所用时间
System.out.println("选择排序前的时间为:"+calendar.getTime());
select.sort(arr);
calendar=Calendar.getInstance();
System.out.println("选择排序后的时间为:"+calendar.getTime());//打印排序后的时间*/
//插入排序所用时间
System.out.println("插入排序前的时间为:"+calendar.getTime());
insert.sort(arr);
calendar=Calendar.getInstance();
System.out.println("插入排序后的时间为:"+calendar.getTime());//打印排序后的时间*/
//快速排序所用时间
System.out.println("快速排序前的时间为:"+calendar.getTime());
quick.sort(0, arr.length-1, arr);
calendar=Calendar.getInstance();
System.out.println("快速排序后的时间为:"+calendar.getTime());//打印排序后的时间
//冒泡排序后的结果
bubble.sort(arr);
System.out.println("冒泡排序之后的数组顺序为:");
for(int i=0;i<arr.length;i++)
{
System.out.print(arr[i]+" ");
}
System.out.println();
//选择排序后的结果
select.sort(arr);
System.out.println("选择排序之后的数组顺序为:");
for(int i=0;i<arr.length;i++)
{
System.out.print(arr[i]+" ");
}
System.out.println();
//插入排序的结果
insert.sort(arr);
System.out.println("插入排序之后的数组顺序为:");
for(int i=0;i<arr.length;i++)
{
System.out.print(arr[i]+" ");
}
System.out.println();
//快速排序的结果
quick.sort(0, arr.length-1, arr);
System.out.println("快速排序之后的数组顺序为:");
for(int i=0;i<arr.length;i++)
{
System.out.print(arr[i]+" ");
}
} }
//快速排序
class Quick{
public void sort(int fist,int last,int arry[]){
int f=fist;
int l=last;
int mid=arry[(fist+last)/2];
int temp=0;
while(f<l){
while(arry[f]<mid) f++;
while(arry[l]>mid) l--;
if(f>=l) break;
temp=arry[f];
arry[f]=arry[l];
arry[l]=temp;
if(arry[f]==mid) --l;
if(arry[l]==mid) ++f;
}
if(f==l){
f++;
l--;
}
//利用递归快速排序
if(fist<l) sort(fist,l,arry);
if(last>f) sort(f,last,arry);
}
}
//插入排序
class Insert{
public void sort(int arry[]){
for(int i=1;i<arry.length;i++)
{
int InsertNum=arry[i];
int Index=i-1;
while(Index>=0&&InsertNum<arry[Index])
{
arry[Index+1]=arry[Index];//将前一个数复制给后一个比他小的数
Index--;
}
arry[Index+1]=InsertNum;//将该插入的数复制给前一个较小的数
}
}
}
//冒泡排序
class Bubble{
public void sort(int arry[]){
int temp=0;
for(int i=0;i<arry.length-1;i++)
{
for(int j=0;j<arry.length-i-1;j++)
{
if(arry[j]>arry[j+1])
{
temp=arry[j];
arry[j]=arry[j+1];
arry[j+1]=temp;
}
}
}
}
}
//选择排序
class Select{
public void sort(int arry[]){
int temp=0;
for(int i=0;i<arry.length-1;i++)
{
int min=arry[i];
int minIndex=i;
for(int j=i+1;j<arry.length-1;j++)
{
if(min>arry[j])
{
min=arry[j];
minIndex=j;
}
}
temp=arry[i];
arry[i]=arry[minIndex];
arry[minIndex]=temp;
}
}
}
冒泡,选择,插入,快速排序在Java中的实现的更多相关文章
- C++学习(三十八)(C语言部分)之 排序(冒泡 选择 插入 快排)
算法是解决一类问题的方法排序算法 根据元素大小关系排序 从小到大 从大到小冒泡 选择 插入 快排希尔排序 归并排序 堆排序 冒泡排序 从头到尾比较 每一轮将最大的数沉底 或者最小数字上浮 选择排序 1 ...
- python 数据结构与算法之排序(冒泡,选择,插入)
目录 数据结构与算法之排序(冒泡,选择,插入) 为什么学习数据结构与算法: 数据结构与算法: 算法: 数据结构 冒泡排序法 选择排序法 插入排序法 数据结构与算法之排序(冒泡,选择,插入) 为什么学习 ...
- python 中的一些基础算法:递归/冒泡/选择/插入
递归算法 如果一个函数包含了对自己的调用,那么这个函数就是递归的. 比如我们计算下1-7乘法的计算: def func(n): if n ==1 : return 1 return n*func(n- ...
- 基本排序-冒泡/选择/插入(python)
# -*- coding: utf-8 -*- import random def bubble_sort(seq): n = len(seq) for i in range(n-1): print( ...
- 从同步原语看非阻塞同步以及Java中的应用
非阻塞同步:基于冲突检测的乐观并发策略,通俗讲就是先进行操作,如果没有其他线程争用共享数据,那操作就成功了,如果争用数据有冲突那就采用其他的补偿措施(最常见的就是不断重试直到成功),这种乐观的并发策略 ...
- Eclipse中的快捷键快速生成常用代码(例如无参、带参构造,set、get方法),以及Java中重要的内存分析(栈、堆、方法区、常量池)
(一)Eclipse中的快捷键: ctrl+shift+f自动整理选择的java代码 alt+/ 生成无参构造器或者提升信息 alt+shift+s+o 生成带参构造 ctrl+shift+o快速导 ...
- 详解Java中的字符串
字符串常量池详解 在深入学习字符串类之前, 我们先搞懂JVM是怎样处理新生字符串的. 当你知道字符串的初始化细节后, 再去写String s = "hello"或String s ...
- java 基础排序(冒泡、插入、选择、快速)算法回顾
java 基础排序(冒泡.插入.选择.快速)算法回顾 冒泡排序 private static void bubbleSort(int[] array) { int temp; for (int i = ...
- Java中的经典算法之选择排序(SelectionSort)
Java中的经典算法之选择排序(SelectionSort) 神话丿小王子的博客主页 a) 原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕.也就是:每一趟 ...
随机推荐
- EasyUI tabs指定要显示的tab
<div id="DivBox" class="easyui-tabs" style="width: 100%; height: 100%;& ...
- Linux Java 环境配置及内置tomcat部署
tar zxvf jdk-8u101-linux-x64.tar.gz vi /etc/profile JAVA_HOME=/home/puma/jdk1.8.0_111JAVA_BIN=/home/ ...
- centos iftop iotop htop
centos6.4安装iftopyum install gccyum -y install libpcap libpcap-develyum -y install ncurses ncurses-de ...
- oracle语句insert into select如何加后续插入条件
oracle语句insert into select如何加后续插入条件 2014-01-21 10:48匿名 分类:其他编程语言 | 浏览 2746 次 oracle中有批量插入语句insert i ...
- UVA506-System Dependencies(拓扑序)
Problem UVA506-System Dependencies Accept:285 Submit:2824 Time Limit: 3000 mSec Problem Description ...
- MySQL主从同步原理
mysql主从复制用途 实时灾备,用于故障切换 读写分离,提供查询服务 备份,避免影响业务 主从部署必要条件 主库开启binlo日志(设置log-bin参数) 主从server-id不同 从库可以连同 ...
- 'style-loader', 'css-loader'使用
'style-loader', 'css-loader'使用 1.安装 npm install style-loader css-loader --save-dev 2.配置 webpack.conf ...
- Word2010中如何在斜线表格中添加文字
http://jingyan.baidu.com/article/335530daa4127f19cb41c331.html
- B-Tree外存数据结构 _(外存储器—磁盘)第一部分
1.外存储器—磁盘 计算机存储设备一般分为两种:内存储器(main memory)和外存储器(external memory).内存存取速度快,但容量小,价格昂贵,而且不能长期保存数据(在不通电情况下 ...
- Mybatis学习总结(三)——SqlMapConfig.xml全局配置文件解析
经过上两篇博文的总结,对mybatis中的dao开发方法和流程基本掌握了,这一节主要来总结一下mybatis中的全局配置文件SqlMapConfig.xml在开发中的一些常用配置,首先看一下该全局配置 ...