冒泡,选择,插入,快速排序在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) 原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕.也就是:每一趟 ...
随机推荐
- JavaScript中数组的增删改查以及应用方式
数组的增加方法 1.push()方法向数组中末尾添加一个元素,原数组改变 var arr=[1,2,3,4]; var arr1=arr.push(6); console.log(arr);//打印出 ...
- Android Studio打开SDK更新对话框
再进行android自动化时,有时需要用到android的一些api,但苦于找不到 api文档,各种论坛查看是否有自己所需要的api,甚是麻烦.下面介绍如何通过 android studio将 and ...
- 视频播放flv player的使用
JW FLV PLAYER 中文文档 使用方法:如果你仅需要播放一个FLV文件[例如“video.flv”],那么只要把“video.flv”和压缩包内的 flvplayer.swf复制到同一个目录内 ...
- Spring集成JUnit单元测试框架
一.JUnit介绍 JUnit是Java中最有名的单元测试框架,用于编写和运行可重复的测试,多数Java的开发环境都已经集成了JUnit作为单元测试的工具.好的单元测试能极大的提高开发效率和代码质量. ...
- Reflection 反射
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/A__17/article/details/30571923 1.概念:所谓的反射.能够理解为在运行时 ...
- centos7下安装docker(8.1运行容器)
从今天开始学习docker container 1.docker run 之前我们在学习制作镜像以及制作私有仓库的时候已经用到docker run -it以及docker run -d来临时运行一个容 ...
- redis命令大全参考手册
redis功能强大,支持数据类型丰富,以下是redis操作命令大全,基本上涵盖了redis所有的命令,并附有解释说明,大家可以收藏.参考,你一定要知道的是:redis的key名要区分大小写,在redi ...
- M600 (1)飞行注意事项
- 使用 ps、strace、lsof 进行 Linux 进程 trouble-shooting
linux_observability_tools 介绍 在Linux 下进行进程的排错,有很多方法.比如,修改源代码,print出一些关键的信息,如果代码是Python 的话,可以使用trace ...
- 区分Web Server和应用服务器
一般的信息服务系统架构如下图所示: Web Server:提供Web信息浏览服务,主要处理的静态资源(session,request,js,html,cs等),如响应http请求,响应请求返回静态ht ...