前面写了js的排序实现,总得玩玩java的哈。

同样,冒泡、选择、快速(这三个之前实现过也写过文章)、堆排序,然后做比较。

主要遇到的难点:

- -||想轻松点写个封装计时的逻辑,不想每调用一个排序就要写一个计时代码。想想,还是javascript写起来方便;

java的话,我想到的方法是写一个抽象类:抽象出排序方法,实现一个排序计时方法(该方法调用了抽象排序,但在先后排序时加入计时代码[感觉像是aop操作]);

接着所有排序类都继承这个抽象类,并实现排序方法,调用的时候直接调用继承的排序计时方法,这样就不用写多余的代码了。(不过这还搞继承,有点。。。不知道有啥高招呢?)

下面是展示各排序代码:

冒泡:

 public class BubbleSort extends SortAbstract{

     public static void main(String[] args) {
int[] a = {1,8,5,6,3,7,5,4,8,9,12,2};
new BubbleSort().sort(a);
for(int c : a){
System.out.println(c);
}
}
public void sort(int[] array){
if(array.length == 0)return ;
for(int i=0;i<array.length-1;i++){//i是计数标记
for(int j=0;j<array.length-i-1;j++){//注意终止条件的判断,冒泡的亮点在于从头到尾一对一对比较
if(array[j]>array[j+1]){
swap(array, j, j+1);
}
}
}
}
public static void swap(int[] array,int i,int j){
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}

选择:

 public class ChooseSort extends SortAbstract{
public static void main(String[] args) {
int[] a = {1,8,5,6,3,7,5,4,8,9,12,2};
new ChooseSort().sort(a);
for(int c : a){
System.out.println(c);
}
} public void sort(int[] array){
if(array.length == 0)return ;
for(int i=0;i<array.length-1;i++){
for(int j=i+1;j<array.length;j++){
if(array[i]>array[j]){
swap(array, i, j);
}
}
}
} public static void swap(int[] array,int i,int j){
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}

快速:

 public class QuickSort extends SortAbstract{
public static void qSort(int[] num,int low,int high){
if(low<high){
int pivotloc = partition(num,low,high);
qSort(num, low, pivotloc-1);
qSort(num, pivotloc+1, high);
}
}
public void sort(int[] array){
qSort(array, 0, array.length-1);
}
public static int partition(int[] num,int low,int high){
int mid = num[low];
int pivotkey = num[low];
while(low<high){
while(low<high&&num[high]>=pivotkey){
--high;
}
num[low] = num[high];
while(low<high&&num[low]<=pivotkey){
++low;
}
num[high]=num[low];
}
num[low] = mid;
return low;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] num = {9,18,-8,-6,-57,5,62,0};
qSort(num, 0, num.length-1);
for(int i=0;i<num.length;i++){
System.out.println(num[i]);
}
} }

堆:

 public class HeapSort extends SortAbstract {
public void sort(int[] array){
if(array.length<=1){
return;
}
int len = array.length;
for(int i=len/2+1;i>=0;i--){//初始最大堆 无序数组,由最右一个非子节点开始。这里len/2 +1 没想明白
maxHeapify(array, i, len);
}
for(int i = len-1; i>0; i-- ){
swap(array, 0, i); //每次将堆根节点与尾部交换,然后逻辑上数组放弃掉尾部,实际有点像尾部冒泡
maxHeapify(array, 0, --len); //从顶部开始顶堆调整
}
}
public static int getLeft(int index){
return index*2+1;
}
public static int getRight(int index){
return (index+1)*2;
}
public static void swap(int[] array, int i, int j){
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
public static void maxHeapify(int[] array, int index, int len){
if(array.length==0 || len<=1){
return;
}
int largest;
int left = getLeft(index);
int right = getRight(index);
if(left<len&&array[index]<array[left]){
largest = left;
}else{
largest = index;
}
if(right<len && array[right]>array[largest]){
largest = right;
}
if(largest!=index){
swap(array, largest, index); //交换两个位置的元素,并递归调用调整交换的孩子节点
maxHeapify(array, largest, len);
}
}
public static void main(String[] args){
int[] a = {1,8,5,6,3,7,5,4,8,9,12,2};
new HeapSort().sort(a);
for(int c : a){
System.out.println(c);
}
}
}

计时抽象类:

 public abstract class SortAbstract {
public abstract void sort(int[] array);
public void runWithTimer(int[] array){
Date start = new Date();
this.sort(array);
Date end = new Date();
System.out.println("排序时间:(ms)"+(end.getTime()-start.getTime()));
}
}

测试用例:

 public class SortTestMain {
public static void main(String[] args){
int[] small = {6,44,33,2,3,5,2,1,7,9,8,14};
BubbleSort bubbleSort = new BubbleSort();
ChooseSort chooseSort = new ChooseSort();
QuickSort quickSort = new QuickSort();
HeapSort heapSort = new HeapSort();
System.out.println("冒泡排序:");
//int[] smallUse = small.clone();
bubbleSort.runWithTimer(small.clone());
System.out.println("选择排序:");
chooseSort.runWithTimer(small.clone());
System.out.println("快速排序:");
quickSort.runWithTimer(small.clone());
System.out.println("堆排序:");
heapSort.runWithTimer(small.clone()); System.out.println("对a[10000]排序:");
int[] big = new int[10000];
for(int i=0; i<10000; i++){
big[i] = (int)Math.floor(Math.random()*100001);
}
System.out.println("冒泡排序:");
//int[] smallUse = small.clone();
bubbleSort.runWithTimer(big.clone());
System.out.println("选择排序:");
chooseSort.runWithTimer(big.clone());
System.out.println("快速排序:");
quickSort.runWithTimer(big.clone());
System.out.println("堆排序:");
heapSort.runWithTimer(big.clone());
}
}

测试结果:

结论:

  几个元素的排序,基本很快。只有当数据开始多时,堆和快速开始展现出优势。

java排序学习笔记的更多相关文章

  1. [原创]java WEB学习笔记95:Hibernate 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  2. 尚学堂JAVA基础学习笔记

    目录 尚学堂JAVA基础学习笔记 写在前面 第1章 JAVA入门 第2章 数据类型和运算符 第3章 控制语句 第4章 Java面向对象基础 1. 面向对象基础 2. 面向对象的内存分析 3. 构造方法 ...

  3. 20145213《Java程序设计学习笔记》第六周学习总结

    20145213<Java程序设计学习笔记>第六周学习总结 说在前面的话 上篇博客中娄老师指出我因为数据结构基础薄弱,才导致对第九章内容浅尝遏止地认知.在这里我还要自我批评一下,其实我事后 ...

  4. java JDK8 学习笔记——助教学习博客汇总

    java JDK8 学习笔记——助教学习博客汇总 1-6章 (by肖昱) Java学习笔记第一章——Java平台概论 Java学习笔记第二章——从JDK到IDEJava学习笔记第三章——基础语法Jav ...

  5. java JDK8 学习笔记——第16章 整合数据库

    第十六章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API中的接口会有数据库厂商操作,称为JDBC驱动程 ...

  6. [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  7. [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  8. Android(java)学习笔记267:Android线程池形态

    1. 线程池简介  多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.     假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...

  9. java多线程学习笔记——详细

    一.线程类  1.新建状态(New):新创建了一个线程对象.        2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中, ...

随机推荐

  1. ffmpeg-20161003[04,05.06]-bin.7z

    ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 5 屏幕横向放大 20 像素 6 屏幕横向缩小 20 像素 S 下一帧 [ -2秒 ] +2 ...

  2. Echarts 3.19 制作常用的图形 非静态

    最近阿里内部使用的 图表也向外开放了 而百度就好像更有良心一点,Echarts 早就开放了 . 自己学Echarts的时候走了很多的弯路,毕竟谁让自己菜呢,多撞几次南墙才晓得疼 才知道学习方法,新手上 ...

  3. Json数组追加数据

    背景:在做一个购物车的时候,点击第一个商品,然后存入一个json数组中,点击第二个商品的时候,又继续在json数组中追加,代码如下: <script type="text/javasc ...

  4. Git 小技巧

    分享git的几个小技巧,后面会根据使用补充.目前包括git撤销本地修改.git回退到前n个版本.git多用户提交冲突解决.git 命令简化.欢迎大家补充^_* 1.git撤销本地修改 git rese ...

  5. GroupBy(..)的四种声明方式的理解及调用

    这里我们以 List<Student> studs作为 source,但是注意,studs中的学生可以是分别属于不同的班级和年级 先看GroupBy的第一种声明: public stati ...

  6. Sublime Text 2 设置tab空格

    打开Sublime Text 2 英文版:选择Preference-defalut 中文版:选择Preference-键绑定-默认 找到"translate_tabs_to_spaces&q ...

  7. mvc file控件无刷新异步上传操作

    前言 上传文件应该是很常见必不可少的一个操作,网上也有很多提供的上传控件.今天遇到一个问题:input控件file无法进行异步无刷新上传.真真的感到别扭.所以就尝试这去处理了一下.主要分三个部分:上传 ...

  8. JS基础学习(一)

    首先感谢 http://www.w3school.com.cn/js/index.asp 学js真的很方便,&下面的内容其实是我自己做的一个备忘 第一节 大致了解 一 js基本介绍 1.轻量级 ...

  9. Oracle SQL的硬解析和软解析

    我们都知道在Oracle中每条SQL语句在执行之前都需要经过解析,这里面又分为软解析和硬解析.在Oracle中存在两种类型的SQL语句,一类为 DDL语句(数据定义语言),他们是从来不会共享使用的,也 ...

  10. 剑指Offer-【面试题03:二维数组中的查找】

    package com.cxz.question3; /* * 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. * 请完成一个函数,输入这样的一个二维数组和 ...