归并排序
来源:互联网 发布:ipad打谱软件 编辑:程序博客网 时间:2024/06/02 03:28
public class MergeSort {
//排序函数,排序思路,对一个数组排序,只需要把前半部分排序,后半部分排序,然后调用merge函数即可。
private static <AnyType extends Comparable<? super AnyType>>
void mergeSort(AnyType[] a,AnyType[] tmpArray,int left,int right){
if(left<right){
int center=(left+right)/2;
mergeSort(a,tmpArray,left,center);
mergeSort(a,tmpArray,center+1,right);
merge(a,tmpArray,left,center,right);
}
}
//对a数组排序
public static <AnyType extends Comparable<? super AnyType>>
void mergeSort(AnyType[] a){
@SuppressWarnings("unchecked")
AnyType[] tmpArray=(AnyType[])new Comparable[a.length];
mergeSort(a,tmpArray,0,a.length-1);
}
//对两个已经排序好的数组进行排序,用tmp调度。
private static <AnyType extends Comparable<? super AnyType>> void
merge(AnyType[] a,AnyType[] tmp,int left,int center,int right){
int _leftend=center;
int _left=left,_center=center+1,_right=right;
int myleft=left;
while(_left<=_leftend&&_center<=right){
if(a[_left].compareTo(a[_center])<0){
tmp[myleft++]=a[_left++];
}else{
tmp[myleft++]=a[_center++];
}
}
while(_left<=_leftend){
tmp[myleft++]=a[_left++];
}
while(_center<=_right){
tmp[myleft++]=a[_center++];
}
for(int i=left;i<=right;i++){
a[i]=tmp[i];
}
}
//排序函数,排序思路,对一个数组排序,只需要把前半部分排序,后半部分排序,然后调用merge函数即可。
private static <AnyType extends Comparable<? super AnyType>>
void mergeSort(AnyType[] a,AnyType[] tmpArray,int left,int right){
if(left<right){
int center=(left+right)/2;
mergeSort(a,tmpArray,left,center);
mergeSort(a,tmpArray,center+1,right);
merge(a,tmpArray,left,center,right);
}
}
//对a数组排序
public static <AnyType extends Comparable<? super AnyType>>
void mergeSort(AnyType[] a){
@SuppressWarnings("unchecked")
AnyType[] tmpArray=(AnyType[])new Comparable[a.length];
mergeSort(a,tmpArray,0,a.length-1);
}
//对两个已经排序好的数组进行排序,用tmp调度。
private static <AnyType extends Comparable<? super AnyType>> void
merge(AnyType[] a,AnyType[] tmp,int left,int center,int right){
int _leftend=center;
int _left=left,_center=center+1,_right=right;
int myleft=left;
while(_left<=_leftend&&_center<=right){
if(a[_left].compareTo(a[_center])<0){
tmp[myleft++]=a[_left++];
}else{
tmp[myleft++]=a[_center++];
}
}
while(_left<=_leftend){
tmp[myleft++]=a[_left++];
}
while(_center<=_right){
tmp[myleft++]=a[_center++];
}
for(int i=left;i<=right;i++){
a[i]=tmp[i];
}
}
}
测试:
public static void main(String[] args) {
// TODO Auto-generated method stub
Integer[] nums=new Integer[]{1,5,1,6,2,7,3,5,2,8,3,4};
//Shellsort.shellsort(nums);
//Heapsort.heapsort(nums);
MergeSort.mergeSort(nums);
for(Integer num:nums){
System.out.print(num+" ");
}
效果:
1 1 2 2 3 3 4 5 5 6 7 8
0 0
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- tomcat源码浅析(五)之请求的完整过程(http1.1)
- 模拟select,鼠标从点击区域到显示区域完美过渡
- Android 与WebView中的js代码的交互记录
- 微信公众号支付开发的最佳调试工具--花生壳
- 深入理解Spring的两大特征(IOC和AOP)
- 归并排序
- 项目打包遇到问题(一)
- Swing简介
- JAVA快速查找XML中错误的语法
- JavaScript中setInterval的用法
- 尼姆博弈
- 京峰运维学习系列--3
- System.getProperty("属性名")方法的使用
- jstl拆分字符串