近几天再重新看数据结构的书时,根据各种排序的空间复杂度,发现快速排序所用时间是最短的,也即是说快速排序的速度最快。因此想验证一下具体这几个排序发的快慢,所以在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中的实现的更多相关文章

  1. C++学习(三十八)(C语言部分)之 排序(冒泡 选择 插入 快排)

    算法是解决一类问题的方法排序算法 根据元素大小关系排序 从小到大 从大到小冒泡 选择 插入 快排希尔排序 归并排序 堆排序 冒泡排序 从头到尾比较 每一轮将最大的数沉底 或者最小数字上浮 选择排序 1 ...

  2. python 数据结构与算法之排序(冒泡,选择,插入)

    目录 数据结构与算法之排序(冒泡,选择,插入) 为什么学习数据结构与算法: 数据结构与算法: 算法: 数据结构 冒泡排序法 选择排序法 插入排序法 数据结构与算法之排序(冒泡,选择,插入) 为什么学习 ...

  3. python 中的一些基础算法:递归/冒泡/选择/插入

    递归算法 如果一个函数包含了对自己的调用,那么这个函数就是递归的. 比如我们计算下1-7乘法的计算: def func(n): if n ==1 : return 1 return n*func(n- ...

  4. 基本排序-冒泡/选择/插入(python)

    # -*- coding: utf-8 -*- import random def bubble_sort(seq): n = len(seq) for i in range(n-1): print( ...

  5. 从同步原语看非阻塞同步以及Java中的应用

    非阻塞同步:基于冲突检测的乐观并发策略,通俗讲就是先进行操作,如果没有其他线程争用共享数据,那操作就成功了,如果争用数据有冲突那就采用其他的补偿措施(最常见的就是不断重试直到成功),这种乐观的并发策略 ...

  6. Eclipse中的快捷键快速生成常用代码(例如无参、带参构造,set、get方法),以及Java中重要的内存分析(栈、堆、方法区、常量池)

    (一)Eclipse中的快捷键:  ctrl+shift+f自动整理选择的java代码 alt+/ 生成无参构造器或者提升信息 alt+shift+s+o 生成带参构造 ctrl+shift+o快速导 ...

  7. 详解Java中的字符串

    字符串常量池详解 在深入学习字符串类之前, 我们先搞懂JVM是怎样处理新生字符串的. 当你知道字符串的初始化细节后, 再去写String s = "hello"或String s ...

  8. java 基础排序(冒泡、插入、选择、快速)算法回顾

    java 基础排序(冒泡.插入.选择.快速)算法回顾 冒泡排序 private static void bubbleSort(int[] array) { int temp; for (int i = ...

  9. Java中的经典算法之选择排序(SelectionSort)

    Java中的经典算法之选择排序(SelectionSort) 神话丿小王子的博客主页 a) 原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕.也就是:每一趟 ...

随机推荐

  1. centos7下安装docker(9.3容器对资源的使用限制-Block IO))

    Block IO:指的是磁盘的读写,docker 可以通过设置权重,限制bps和iops的方式控制容器读写磁盘的带宽 注:目前block IO限额只对direct IO(不使用文件缓存)有效. 1.B ...

  2. RESTful API实战笔记(接口设计及Java后端实现)

    写在前面的话 原计划这部分代码的更新也是上传到ssm-demo仓库中,因为如下原因并没有这么做: 有些使用了该项目的朋友建议重新创建一个仓库,因为原来仓库中的项目太多,结构多少有些乱糟糟的. 而且这次 ...

  3. jquery ajax 方法实例

      每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code     直接上代码, ajax实例: $.ajax({      type : & ...

  4. CSS3渐变——径向渐变

    上节在<再说CSS3渐变——线性渐变>和大家一起学习了CSS3 Gradient中径向渐变最新语法(称得上是W3C的标准语法)相关知识以及其基本使用.今天我们在这一篇中主要和大家一起来了解 ...

  5. gas问题out of gas的解决

    1.昨天遇见了还是以前遇见的问题,就是发现有些函数就是不能用web3调用,然后怎么弄都写不到数组上,但是今天终于将它解决了web3的学习:https://github.com/ethereum/wik ...

  6. <mvc:annotation-driven />注解意义(转)

    文章转自http://elf8848.iteye.com/blog/875830 http://www.cnblogs.com/shuo1208/p/5552134.html 暂时只知道对json的支 ...

  7. matlab fspecial

    Matlab 的fspecial函数用法 fspecial函数用于建立预定义的滤波算子,其语法格式为:h = fspecial(type)h = fspecial(type,para)其中type指定 ...

  8. Omi框架学习之旅 - 组件 及原理说明

    hello world demo看完后其实基本的写法就会了. 但是omi中的组件是神马鬼?其实我也不知道组件是啥. 百度百科是这么说的: 是对数据和方法的简单封装.es6中,一个类其实也可以做到对方法 ...

  9. [01] 浅谈RESTful风格的API

    1.什么是RESTful风格的API REST,即Representational State Transfer,可以理解为"(资源的)表现层状态转化". 在网络上,我们通过浏览器 ...

  10. 『转』MySQL存储过程语法例子

    原文地址:http://blog.chinaunix.net/uid-540802-id-138873.html ------------------------- 自动生成随机数据存储过程 ---- ...