冒泡,选择,插入,快速排序在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) 原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕.也就是:每一趟 ...
随机推荐
- Class doesn't contain any JAX-RS annotated method
项目中使用了Jersey RESTful风格的注解 , 根据错误提示就知道了 , 在类中没有带注解的方法 ,所以只要在方法上添加 @path() 注解就行了,至少要有一个方法带有Jersey注解
- ST_Geometry效率的测试与分析
测试环境 数据库:Oracle11g R1(11.1.0.6) 64Bit 中间件:ArcSDE10 (64Bit) 数据情况:点数据(point,231772条记录),面数据(poly,12条记录) ...
- C#反射の反射详解
C#反射の反射详解(点击跳转)C#反射の反射接口(点击跳转)C#反射反射泛型接口(点击跳转)C#反射の一个泛型反射实现的网络请求框架(点击跳转) 一.什么是反射 反射(Reflection):这是.N ...
- NET Framework 各版本官方下载
https://msdn.microsoft.com/en-us/library/5a4x27ek(v=vs.110).aspx https://www.microsoft.com/zh-CN/dow ...
- javascript中call,apply,bind的用法对比分析
这篇文章主要给大家对比分析了javascript中call,apply,bind三个函数的用法,非常的详细,这里推荐给小伙伴们. 关于call,apply,bind这三个函数的用法,是学习java ...
- QT插件+ROS 3 导入现有ROS包
http://blog.csdn.net/u013453604/article/details/52167213#t5
- MP实战系列(七)之集成springboot
springboot是现在比较流行的微服使用的框架,springboot本质上就是将spring+springmvc+mybatis零配置化,基本上springboot的默认配置符合我们的开发.当然有 ...
- Android程序的反破解技术
Android 程序的破解一般步骤如下:反编译.静态分析.动态调试.重编译.我们可以从这几个步骤着手反破解 反编译 我们可以查找反编译器的漏洞,从而使反编译器无法正确解析APK文件 静态分析 对jav ...
- flask config
# config配置 { 'DEBUG': False, # 是否开启Debug模式 'TESTING': False, # 是否开启测试模式 'PROPAGATE_EXCEPTIONS': None ...
- linux简单的安全防护
注: 1.该脚本是以centos7.4.1708做的 2.函数jia/jian是加权限/减权限 3.改过密码以后,下次使用新创建的用户登录时将提示更改密码,第一次要输入原始的密码,原始密码改脚本中定义 ...