在学java泛型,于是把排序拿来练练手了

import java.util.Arrays;

public class GenericArraySort {
public static void main(String[] args){ Integer[] integers = getGenericArray(2,41,12,3);
bubbleSort(integers);
System.out.println("integer:");
System.out.println(Arrays.toString(integers)); Long[] longs = getGenericArray(123L, 22L,12L, 3L);
selectSort(longs);
System.out.println("long:");
System.out.println(Arrays.toString(longs)); Float[] floats = getGenericArray(3.2f,2.4f,1.5f, 22.2f);
insertSort(floats);
System.out.println("float:");
System.out.println(Arrays.toString(floats)); Double[] doubles = getGenericArray(5.2,2.4,1.5,22.2);
mergeSort(doubles);
System.out.println("double:");
System.out.println(Arrays.toString(doubles));
} /**
* 比较2个数字的大小
* @param a
* @param b
* @return
*/
public static boolean compareNumberVal(Number a, Number b){
boolean ret = false; if(a instanceof Integer){
if(a.intValue() > b.intValue()){
ret = true;
}
}else if(a instanceof Long){
if(a.longValue() > b.longValue()){
ret = true;
}
}else if(a instanceof Float){
if(a.floatValue() > b.floatValue()){
ret = true;
}
}else if(a instanceof Double){
if(a.doubleValue() > b.doubleValue()){
ret = true;
}
}else if(a instanceof Byte){
if(a.byteValue() > b.byteValue()){
ret = true;
}
}else if(a instanceof Short){
if(a.shortValue() > b.shortValue()){
ret = true;
}
}
return ret;
} /**
* 交换整型数组 i 和 j 的value
* @param i
* @param j
* @param param
* @param <T>
*/
public static <T extends Number> void exchangeKey(int i, int j, T param[]){
T tmp = param[i];
param[i] = param[j];
param[j] = tmp;
} /**
* 冒泡排序
* @param param
* @param <T>
*/
public static <T extends Number> void bubbleSort(T param[]){
int len = param.length;
for(int i = 1; i < len ; i++){
for(int j = len - 1; j >= i; j--){
//一一对比, 逐个替换
if(compareNumberVal(param[j - 1], param[j])){
exchangeKey(j - 1, j, param);
}
}
}
} /**
* 快速选择排序
* @param param
* @param <T>
*/
public static <T extends Number> void selectSort(T param[]){
int len = param.length;
for(int i = 0; i < len ; i++){
T min = param[i];
int minIndex = i;
int oi = i;
for(int j = len - 1; j >= i; j--){
//一一对比, 取得最小的key 再替换
if(compareNumberVal(min, param[j])){
min = param[j];
minIndex = j;
}
}
if(minIndex != oi){
exchangeKey(i, minIndex, param);
}
}
} /**
* 插入排序
* @param param
* @param <T>
*/
public static <T extends Number> void insertSort(T param[]){
int len = param.length;
for(int i = 1; i < len ; i++){
int j = i;
T tmp = param[j]; //存临时变量 //逐个向后比较 假如大于 则往后移
while(j > 0 && compareNumberVal(param[j - 1], tmp)){
param[j] = param[j - 1];
j--;
}
param[j] = tmp;
}
} public static <T extends Number> void mergeSort(T param[]){
mergeProcess(param, 0, param.length - 1);
} /**
* 递归处理归并排序
* @param param
* @param l
* @param r
* @param <T>
*/
public static <T extends Number> void mergeProcess(T param[], int l, int r){ if(l >= r){
return;
}
int mid = (l + r) / 2; //中间位置 把数组切分为2段
mergeProcess(param, l , mid );
mergeProcess(param, mid + 1 , r );
merge(param, l , r);
}
/**
* 合并排序好的数组段
* @param param
* @param l
* @param r
* @param <T>
*/
public static <T extends Number> void merge(T param[], int l, int r){ int mid = (l + r) / 2; //中间位置 把数组切分为2段
int rs = mid + 1; //右侧数组起始key 左 0 - mid 右 rs - r
int cs = l; //临时排序数组的起始key(和原数组 l相同)
int s = l; //备份原数组起始key
Number[] tmpArr = new Number[param.length]; //临时排序数组 //重新排序 2个数组取最前面key 比较大小 放到 临时数组
while(l <= mid && rs <= r){
if(compareNumberVal(param[l], param[rs])){
tmpArr[cs++] = param[rs++];
}else{
tmpArr[cs++] = param[l++];
}
} //左侧 剩余部分 拷贝 临时数组
while (l <= mid){
tmpArr[cs++] = param[l++];
} //右侧 剩余部分拷贝临时数组
while (rs <= r){
tmpArr[cs++] = param[rs++];
} //临时排序好的数组重新拷贝回 param
while(s <= r){
param[s] = (T)tmpArr[s++];
}
}
/**
* 通过参数获取泛型数组
* @param arg
* @param <T>
* @return
*/
public static <T> T[] getGenericArray(T ... arg){
return arg;
} /**
* 打印泛型数组
* @param a
* @param <T>
*/
public static <T> void showArr(T a[]){
int len = a.length;
for (int i = 0; i < len; i++){
System.out.println(a[i]);
}
}
}

  

java 整型数组基本排序,冒泡,快速选择,插入,归并的更多相关文章

  1. Java整型数组的最大长度到底有多长?

    Java整型数组的最大长度到底有多长? 今天上网查了一下,各种说法都有,这个问题似乎总困扰我们Java初学者,无奈,只好自己试了一下,以下是我的测试代码,如果有错误,还望不吝赐教! 使用eclipse ...

  2. [C][代码实例]整型数组二分排序

    #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h& ...

  3. Java 整型数组只有一个整数是只出现一次的,其余都出现两次

    package writtenExamination; /** * @author lindaZ * @date 2015年10月22日 * @todo 找出数组中仅出现一次的数,其余数字出现两次 * ...

  4. 057 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 04 案例:求整型数组的数组元素的元素值累加和

    057 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 04 案例:求整型数组的数组元素的元素值累加和 本文知识点:求整型数组的数组元素的元素值累加和 案例:求整型数 ...

  5. Android jni 编程4(对基本类型二维整型数组的操作)

    Android jni 编程 对于整型二维数组操作: 类型一:传入二维整型数组,返回一个整型值 类型二:传入二维整型数组,返回一个二维整型数组 声明方法: private native int Sum ...

  6. Android jni 编程3(对基本类型一维整型数组的操作)总结版

    主要学习资料:黑马程序员的NDK方法使用(生产类库so)              jni编程指南中文版(已上传至博客园) 博主文章(它使用的是VS和eclipse联合开发):http://www.c ...

  7. Android jni 编程2(对基本类型一维整型数组的操作)

    参考教程和这位博主的对一维数组的处理,主要包括以下三种类型: //传入一维数组,无返回值 public native void arrayEncode(int[] arr); //传一个一维数组和数组 ...

  8. 实验12:Problem H: 整型数组运算符重载

    Home Web Board ProblemSet Standing Status Statistics   Problem H: 整型数组运算符重载 Problem H: 整型数组运算符重载 Tim ...

  9. c# 计算一个整型数组的平均

    一个整型数组的平均: class Program { static void Main(string[] args) { ,,,,,,,,,}; double avg= GetAvg(array); ...

随机推荐

  1. .Net 内存对象分析

    在生产环境中,通过运行日志我们会发现一些异常问题,此时,我们不能直接拿VS远程到服务器上调试,同时日志输出的信息无法百分百反映内存中对象的状态,比如说我们想查看进程中所有的Socket连接状态.服务路 ...

  2. 2014 Benelux Algorithm Programming Contest (BAPC 14)E

    题目链接:https://vjudge.net/contest/187496#problem/E E Excellent Engineers You are working for an agency ...

  3. struts2中的Ajax异步校验

    登录时验证码的异步校验: 1.验证码生成的是图片因此在struts.xml文件里面配置action 时,result标签中type 属性是stream 2.验证码图片的src的值为配置action名字 ...

  4. Python自学笔记-Django分页器小实例

    from django.core.paginator import Paginator iter = 'abcdefhijklmnopqw' paginator = Paginator(iter,4) ...

  5. webpack2使用ch8-loader解析less less自动添加浏览器前缀

    1 目录结构  安装依赖 "less": "^2.7.2","less-loader": "^4.0.3", 2 web ...

  6. webpack2使用ch4-向根目录index.html文件传参并使用参数 使用线上资源 压缩html

    1 webpack.config.js const webpack = require('webpack'), htmlWebpackPlugin = require('html-webpack-pl ...

  7. win2003服务器定时自动重启命令

    1. win2003可以这样自动重启: 新建一个命令行文件比如reboot.bat 内容如下:shutdown -r -t 30 在计划任务中新建一个任务,程序选择上面这个reboot.cmd文件,时 ...

  8. 解决Jqyery的Trigger事件中两个按钮相互触发至死循环问题

    今天做项目,其中有个功能需要两个图表的联动,用到两个按钮,这两个按钮分别控制两个图表,第一次直接在btn1的单击事件中使用了$("btn2").trigger("clic ...

  9. windows mysql 操作实践

    1.通过navicat for mysql 进行数据库表的输入操作. 2.使用mySQL shell进行查询. 3. 显示数据表中的所有列的名称  show colums from user 4. 进 ...

  10. XtraReports 入门教程

    一个链接:http://www.cnblogs.com/springSky/tag/XtraReports%20%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B/ 与之相同功能 ...