java 整型数组基本排序,冒泡,快速选择,插入,归并
在学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 整型数组基本排序,冒泡,快速选择,插入,归并的更多相关文章
- Java整型数组的最大长度到底有多长?
Java整型数组的最大长度到底有多长? 今天上网查了一下,各种说法都有,这个问题似乎总困扰我们Java初学者,无奈,只好自己试了一下,以下是我的测试代码,如果有错误,还望不吝赐教! 使用eclipse ...
- [C][代码实例]整型数组二分排序
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h& ...
- Java 整型数组只有一个整数是只出现一次的,其余都出现两次
package writtenExamination; /** * @author lindaZ * @date 2015年10月22日 * @todo 找出数组中仅出现一次的数,其余数字出现两次 * ...
- 057 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 04 案例:求整型数组的数组元素的元素值累加和
057 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 04 案例:求整型数组的数组元素的元素值累加和 本文知识点:求整型数组的数组元素的元素值累加和 案例:求整型数 ...
- Android jni 编程4(对基本类型二维整型数组的操作)
Android jni 编程 对于整型二维数组操作: 类型一:传入二维整型数组,返回一个整型值 类型二:传入二维整型数组,返回一个二维整型数组 声明方法: private native int Sum ...
- Android jni 编程3(对基本类型一维整型数组的操作)总结版
主要学习资料:黑马程序员的NDK方法使用(生产类库so) jni编程指南中文版(已上传至博客园) 博主文章(它使用的是VS和eclipse联合开发):http://www.c ...
- Android jni 编程2(对基本类型一维整型数组的操作)
参考教程和这位博主的对一维数组的处理,主要包括以下三种类型: //传入一维数组,无返回值 public native void arrayEncode(int[] arr); //传一个一维数组和数组 ...
- 实验12:Problem H: 整型数组运算符重载
Home Web Board ProblemSet Standing Status Statistics Problem H: 整型数组运算符重载 Problem H: 整型数组运算符重载 Tim ...
- c# 计算一个整型数组的平均
一个整型数组的平均: class Program { static void Main(string[] args) { ,,,,,,,,,}; double avg= GetAvg(array); ...
随机推荐
- P60 2.6
import java.util.Scanner; public class Num { public static void main(String[] args) { Scanner input ...
- Quartz入门案例与介绍(与spring整合)
Quartz概述 Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或 ...
- ViewData 不可以有特殊字符,比如. ,等只允许数字字符和空格
ViewData 不可以有特殊字符,比如. ,等只允许数字字符和空格
- Java 浅拷贝和深拷贝的理解和实现方式
Java中的对象拷贝(Object Copy)指的是将一个对象的所有属性(成员变量)拷贝到另一个有着相同类类型的对象中去.举例说明:比如,对象A和对象B都属于类S,具有属性a和b.那么对对象A进行拷贝 ...
- java web 学习笔记 编码问题总结
java web 学习笔记 编码问题总结 1.非form表单中提交的中文参数---------------------------传递给Servlet服务器时,默认以iso-8859-1解码 ...
- JavaWeb之response响应中文乱码问题
response向页面响应中文乱码问题 字节流 * 有可能乱码,与中文转换成字节数组.浏览器打开的默认字符编码有关 * 解决方式:将中文转成字节数组的时候和浏览器默认打开的时候采用的字符集一致 re ...
- JavaScript面向对象基础与this指向问题
前 言 我们的程序语言经历了从"面向机器".到"面向过程".再到"面向对象"的一个过程.而JavaScript是一 ...
- opencv-python:win7下,搭建python2.7.5环境,配置opencv3.1.0准备开工-OpenCV步步精深
我的个人博客:点这里 搭建python2.7.5环境 下载python2.7.5 64位:https://www.python.org/ftp/python/2.7.5/python-2.7.5.am ...
- vDSP加速的应用
vDSP 是IOS提供一系列加速处理算法..在优化时可以考虑应用一二... 1.在项目中加入Accelerate.framework库 点开项目属性->Build Phases->Link ...
- 剖析Prometheus的内部存储机制
Prometheus有着非常高效的时间序列数据存储方法,每个采样数据仅仅占用3.5byte左右空间,上百万条时间序列,30秒间隔,保留60天,大概花了200多G(引用官方PPT). 接下来让我们看看他 ...