在学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. 自测-4 Have Fun with Numbers

    Notice that the number 123456789 is a 9-digit number consisting exactly the numbers from 1 to 9, wit ...

  2. 浪潮之巅——IT产业的三大定律

    说实话除了小说以外,从来没有什么书能让我一口气看完,更不用说IT界的书了.但是吴军老师的<浪潮之巅>这本书除外,电子版的洋洋洒洒五百多页,我一下午就将其看完了.全书通过介绍AT&T ...

  3. NOIP2014_day2:无线网络发射器选址

    #include<stdio.h>//NOIP2014 day2 :无线网络发射器选址 ,max=; ][]; void wifi(int a,int b,int c) { int i,j ...

  4. iOS在类内部怎么访问实例变量比较好?

    OC在类文件的内部访问实例变量,有直接访问和使用getter/setter方法访问两种方式,它们的区别有: 1.直接访问不经过OC的方法分发(method dispatch),所以访问速度比较快,在这 ...

  5. WPF控件 在XP下获得焦点有虚线框

    所有 Button.ListBox等控件获得焦点时有虚线框.如图:选中523这个按钮就出线虚框. 我在App.xaml中添加适应所有按钮的样式,无效 <Style  TargetType=&qu ...

  6. dotweb框架之旅 [二] - 常用对象-App(dotweb)

    dotweb属于一个Web框架,希望通过框架行为,帮助开发人员快速构建Web应用,提升开发效率,减少不必要的代码臃肿. dotweb包含以下几个常用对象: App(dotweb) App容器,为Web ...

  7. 客户机中PLSQL DEV访问虚拟机中的ORCLE11g,错误百出!

    客户机中PLSQL DEV访问虚拟机中的ORCLE11g,错误百出! 创建时间: 2017/10/14 18:44 作者: CNSIMO 标签: ORACLE 忙了一下午,只有两个字形容:麻烦!   ...

  8. 比较两个文件不同以及生成SQL插入语句

    Tips 做一个终身学习的人! 日拱一卒,功不唐捐. 今天有个小小的需求,具体需求是这样的: 有两个文本文件,每个文件都有一些字符串文本: 比较第一个文件中,在第二个文件中,不存在的字符串文本: 把这 ...

  9. 由String的构造方法引申出来的java字符编码

    在String类的constructors中,有一个constructor是将int数组类型转化为字符串: int[] num = {48,49,50,51,52}; String numStr = ...

  10. [bzoj2131]免费的馅饼 树状数组优化dp

    2131: 免费的馅饼 Time Limit: 10 Sec  Memory Limit: 259 MB[Submit][Status][Discuss] Description Input 第一行是 ...