java实现冒泡排序,选择排序,插入排序,快速排序(简洁版)及性能测试
1、冒泡排序是排序里面最简单的了,但性能也最差,数量小的时候还可以,数量一多,是非常慢的。
它的时间复杂度是O(n*n),空间复杂度是O(1)
代码如下,很好理解。
public void bubbleSort(int[] arr){
int temp=0;
for(int i=0;i<arr.length;i++){
for(int j=arr.length-1;j>0;j--){
if(arr[j-1]>arr[j]){
temp=arr[j-1];
arr[j-1]=arr[j];
arr[j]=temp;
}
}
}
}
2、选择排序
选择排序的时间复杂度还有空间复杂度跟冒泡是一样的。
public void chooseSort(int[] arr){
int temp=0;
for(int i=0;i<arr.length;i++){
for(int j=i+1;j<arr.length;j++){
if(arr[i]>arr[j]){
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
}
3、插入排序
插入排序的时间复杂度也是O(n*n),空间复杂度也是O(1)。
public void insertSort(int[] arr){
int tmp=0;
for(int j=1;j<arr.length;j++){
for(int i=0;i<j;i++){
if(arr[i]>arr[j]){
tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;
break;
}
}
}
}
4、快速排序
快速排序通常情况下是最快的,名不虚传啊~平均时间复杂度是 O(Nlog2N),最差也是O(N*N),空间复杂度O(Nlog2N)
public void quickSort(int[] arr,int head,int tail){
int i=head;
int j=tail;
if(i > j){
return;
}
int key=arr[i];
while(i<j){
while(i<j && key<=arr[j]){
j--;
}
if(i<j){
arr[i++]=arr[j];
}
while(i<j && key>=arr[i]){
i++;
}
if(i<j){
arr[j--]=arr[i];
}
}
arr[j]=key;
quickSort(arr,head,j-1);
quickSort(arr,j+1,tail);
}
下面就是性能测试了~
分别为这4个算法生成4个长度为6000的随机数组,然后测排序时间。
代码如下
public static void main(String[] args) throws Exception{
int[] arr1=new int[6000];
for(int i=0;i<arr1.length;i++){
arr1[i]=new Random().nextInt(6000)+1;
}
int[] arr2=new int[6000];
for(int i=0;i<arr2.length;i++){
arr2[i]=new Random().nextInt(6000)+1;
}
int[] arr3=new int[6000];
for(int i=0;i<arr3.length;i++){
arr3[i]=new Random().nextInt(6000)+1;
}
int[] arr4=new int[6000];
for(int i=0;i<arr4.length;i++){
arr4[i]=new Random().nextInt(6000)+1;
}
Test t=new Test();
long m=System.currentTimeMillis();
t.bubbleSort(arr1);
long n=System.currentTimeMillis();
System.out.println("冒泡排序耗时:"+(n-m)+"ms");
long p=System.currentTimeMillis();
t.chooseSort(arr2);
long q=System.currentTimeMillis();
System.out.println("选择排序耗时:"+(q-p)+"ms");
long e=System.currentTimeMillis();
t.insertSort(arr4);
long d=System.currentTimeMillis();
System.out.println("插入排序耗时:"+(d-e)+"ms");
long a=System.currentTimeMillis();
t.quickSort(arr3, 0, arr3.length-1);
long b=System.currentTimeMillis();
System.out.println("快速排序耗时:"+(b-a)+"ms");
}
}
结果如下:
冒泡排序耗时:182ms
选择排序耗时:120ms
插入排序耗时:4ms
快速排序耗时:1ms
见识到快速排序的威力了吧~不过他也是付出了内存空间的代价,如果数据量过大,会出现著名的StackOverFlow栈溢出异常哦~
java实现冒泡排序,选择排序,插入排序,快速排序(简洁版)及性能测试的更多相关文章
- 学习C#之旅 冒泡排序,选择排序,插入排序,希尔排序[资料收集]
关于冒泡排序,选择排序,插入排序,希尔排序[资料收集] 以下资料来源与网络 冒泡排序:从后到前(或者从前到后)相邻的两个两两进行比较,不满足要求就位置进行交换,一轮下来选择出一个最小(或最大)的放到 ...
- python算法(一)基本知识&冒泡排序&选择排序&插入排序
本节内容: 算法基本知识 冒泡排序 选择排序 插入排序 1. 算法基本知识 1.1 什么是算法? 算法(algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为 ...
- 数组排序-冒泡排序-选择排序-插入排序-希尔排序-快速排序-Java实现
这五种排序算法难度依次增加. 冒泡排序: 第一次将数组相邻两个元素依次比较,然后将大的元素往后移,像冒泡一样,最终最大的元素被移到数组的最末尾. 第二次将数组的前n-1个元素取出,然后相邻两个元素依次 ...
- php基础排序算法 冒泡排序 选择排序 插入排序 归并排序 快速排序
<?php$arr=array(12,25,56,1,75,13,58,99,22);//冒泡排序function sortnum($arr){ $num=count($arr); ...
- 过三关 Java冒泡排序选择排序插入排序小练习
材料:猴子排序,按照身高来从小到大来排序. 第一关: 老猴子带领小猴子队伍按大小逐一比较,交换,开始高矮排列队伍.(冒泡排序) 第二关: 太慢了,给第一关增加难度,进行选择排序 第三关: 最后,尝试选 ...
- java冒泡排序-选择排序-插入排序-使用API中文文档直接调用函数
import java.util.Arrays; public class ArrayDemo2_3 { public static void main(String []args) { //---- ...
- 冒泡排序 选择排序 插入排序希尔排序 java
双向冒泡 package com.huang; public class _014_bubb_sort { int[] b={1,2}; static int a[]={12,4,35,65,43,6 ...
- 冒泡排序 & 选择排序 & 插入排序 & 希尔排序 JavaScript 实现
之前用 JavaScript 写过 快速排序 和 归并排序,本文聊聊四个基础排序算法.(本文默认排序结果都是从小到大) 冒泡排序 冒泡排序每次循环结束会将最大的元素 "冒泡" 到最 ...
- 算法 排序lowB三人组 冒泡排序 选择排序 插入排序
参考博客:基于python的七种经典排序算法 [经典排序算法][集锦] 经典排序算法及python实现 首先明确,算法的实质 是 列表排序.具体就是操作的列表,将无序列表变成有序列表! 一 ...
- PHP冒泡排序,选择排序,插入排序
1 冒泡排序是两个元素相互比较,找到最小值,然后冒泡到最后,代码如下:
随机推荐
- WP8.1开发系列之隐藏顶部状态栏
StatusBar statusbar = StatusBar.GetForCurrentView(); await statusbar.HideAsync(); 只能在后台代码中实现,前台xaml不 ...
- SGU题目总结
SGU还是个不错的题库...但是貌似水题也挺多的..有些题想出解法但是不想写代码, 就写在这里吧...不排除是我想简单想错了, 假如哪位神犇哪天发现请告诉我.. 101.Domino(2015.12. ...
- Android 内部存储安装apk文件实现
目前国内市场的山寨机横行,安卓手机升级也是一天一个样,对于原来老手机可能没有SDCARD,导致我们的APP不能下载资源,无法更新APP,针对这种情况有以下解决方案.通过以下函数判断是否有SD卡再判断下 ...
- java.util.MissingResourceException解决策
.properties文件放到当前目录下会报错: 需要放到src文件夹下:
- ThinkPHP第二十五天(自动完成、用户名密码PHP正则、移位或加密函数)
1.ThinkPHP自动完成功能 跟昨天的自动验证功能类似,也是需要在自定义的UserModel类,进行使用. 使用方法:定义$_auto属性 $_auto = array( array(完成字段,完 ...
- 无法打开 configsource 文件
右键点击*.config文件,属性里的“复制到输出目录”选项,选择“始终复制”或“如果较新则复制”,这样生成或运行时,该文件就会出现在bin目录或obj目录中.
- QCombobox设置下拉框的宽度
这几天写一个项目,里面用到qcombobox组件,其中下拉框含有129个子项,所以在点击的时候,一个下拉框就将整个电脑屏幕给占满了,很不好看并且在使用中会造成很大的苦恼.其实我就是想设置一个下拉框最大 ...
- C++读写EXCEL文件OLE,java读写excel文件POI 对比
C++读写EXCEL文件方式比较 有些朋友问代码的问题,将OLE读写的代码分享在这个地方,大家请自己看.http://www.cnblogs.com/destim/p/5476915.html C++ ...
- SQLServer 2008的组成
SQLServer 2008的组成: 1.主要数据库文件:有且只有一个,文件后缀为.mdf. 2.日志文件:至少有一个,文件后缀为.ldf. 3.次要数据库文件:任意个,文件后缀为.ndf.
- 第八届acm省赛 A挑战密室(模拟)
10406: A.挑战密室 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 29 Solved: 10 [Submit][Status][Web Bo ...