近几天再重新看数据结构的书时,根据各种排序的空间复杂度,发现快速排序所用时间是最短的,也即是说快速排序的速度最快。因此想验证一下具体这几个排序发的快慢,所以在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. January 16th, 2018 Week 03rd Tuesday

    Accept who you are, and revel in it. 接受真实的自己并乐在其中. Try to accept youself and try to love yourself mo ...

  2. Apha冲刺! Day2 - 砍柴

    Alpha冲刺! Day2 - 砍柴 今日已完成 晨瑶:没做和主项目相关的事情,除了教队友用gitkraken. 昭锡:学习LitePal对数据库进行操作. 永盛:切换 API 管理平台,继续撰写 A ...

  3. NetCore开源项目集合

    具体见:https://github.com/thangchung/awesome-dotnet-core 半年前看到的,今天又看到了,记录下. 框架类: ZKWeb ABP General ASP. ...

  4. [转]mysql和redis的区别

    转自https://www.cnblogs.com/zxh1297/p/9394108.html 1.mysql和redis的数据库类型 mysql是关系型数据库,主要用于存放持久化数据,将数据存储在 ...

  5. yii2 对象跟数组输出数据到view视图方法

    public function actionJiekou(){ $url = 'http://wap.guoshihui.com/_static/wap/video/startVideo.mp4'; ...

  6. js == 与 === 的区别[转]

    we文章转自http://blog.sina.com.cn/s/blog_4b32835b01014iv9.html 1.对于string,number等基础类型,==和===是有区别的 1)不同类型 ...

  7. VsCode之使用WebView通信

    之前我在这篇文章VsCode插件开发之插件初步通信 通过插件完成通信,这回我还是通过插件,只不过方式主要以在ts文件里面使用webview来进行通信. 另外在此声明,一定要好好看仔细看官方文档,国内关 ...

  8. spring MVC 使用 hibernate validator验证框架,国际化配置

    spring mvc使用hibernate validator框架可以实现的功能: 1. 注解java bean声明校验规则. 2. 添加message错误信息源实现国际化配置. 3. 结合sprin ...

  9. MATLAB中的FOR循环问题

    做量化操作的时候经常需要使用到matlab编写策略或者计算多因子,for循环非常慢,自己找了一些matlab中for循环的优化方法,for的部分每处理一个大矩阵都要花费大量的时间,这是不可避免需要遇到 ...

  10. postfix 邮件服务的安装及详解

    该实验系统:cetnos 6.5 sendmail:性能好,设置复杂,适合老手 qmail:体积小260+k ,模块化.需要做二次开发,适合对邮件性能有要求的 postfix:前身是sendmail, ...