import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class GuiBing {
public static void main(String[] args) throws Exception {
int datalength=1000000;
GuiBing gui=new GuiBing();
int[] array1=gui.createArray(datalength);
int[] array2=gui.createArray(datalength);
Thread.sleep(20000);
long startTime = System.nanoTime();//纳秒精度
long begin_freeMemory=Runtime.getRuntime().freeMemory();
int[] final_array=gui.guibing(array1,array2);
boolean result=gui.testResult(final_array);
long end_freeMemory=Runtime.getRuntime().freeMemory();
System.out.println("result===="+result);
long estimatedTime = System.nanoTime() - startTime;
System.out.println("elapsed time(纳秒精度):"+estimatedTime/100000000.0);
System.out.println("allocated memory:"+(begin_freeMemory-end_freeMemory)/1000.0+" KB");
Thread.sleep(20000);
}
/**
* 显示数组的内容
* @param array
*/
private static void dispalyData(int[] array) {
for(int i=0;i<array.length;i++)
{
System.out.printf("%-6d",array[i]);
}
System.out.println("");
}
/**
* 测试结果
* @param final_array
* @return
*/
private boolean testResult(int[] final_array) {
int length=final_array.length;
for(int i=0;i<length-1;i++){
if(final_array[i]>final_array[i+1]) return false;
}
return true;
}
/**
* 算法的思想是:
* 数组a是有序的,从小到大
* 数组b是有序的,从小到大
* 归并两个数组到一个中
* 1 从两个数组的第一个元素比较,小的放在新数组的第一个位置,小的元素所在的数组索引加1,依此比较
* 直到结束
* 2 将剩余元素直接拷贝到新的数组内
**/
private int[] guibing(int[] a, int[] b) {
int[] temp=new int[a.length*2];
int i=0,j=0,a_length=a.length,b_length=a.length,k=0;
arraySort(a);
arraySort(b);
//dispalyData(a);
//dispalyData(b);
while(i<a_length && j<b_length){
if(a[i]<b[j]){
temp[k]=a[i];
k++;i++;
}else{
temp[k]=b[j];
k++;j++;
}
}
while(i<a_length){
temp[k++]=a[i++];
}
while(j<b_length){
temp[k++]=b[j++];
}
return temp;
}
/**
* 用集合类Collections升序排列
* @param a
*/
@SuppressWarnings({"unchecked","unused"})
private void sort(final int[] a){
List list=new ArrayList();
for(int i=0;i<a.length;i++)
list.add(a[i]);
Collections.sort(list);
Object[] temp=list.toArray();
for(int i=0;i<temp.length;i++){
a[i]=(Integer)temp[i];
}
}
/**
* 使用系统类对数组以升序排序。
* @param a
*/
@SuppressWarnings({"unchecked","unused"})
private void arraySort(final int[] a){
Arrays.sort(a);
}
/**
* 根据参数length创建一个随机的整数数组。数组中的值的小于length*2
* @param length
* @return
*/
private int[] createArray(int length) {
Random random=new Random();
int[] temp=new int[length];
int j=0;
while(j<length){
temp[j++]=random.nextInt(length<<2);
}
return temp;
}
}
分享到:
- 2009-06-14 21:36
- 浏览 1020
- 评论(0)
- 论坛回复 / 浏览 (0 / 2378)
- 查看更多
相关推荐
归并排序,比较高效的排序算法之一。这是一个例子,一个关于归并排序的例子。
用C++实现归并排序,题目基于MIT的算法导论中的第二章中的归并排序算法要求,visual studio 2010 实现
今天学了折半查找算法,折半查找是蛮简单的,但是归并排序我就挺懵比,看教材C语言写的归并排序看不懂,后来参考了别人的博客,终于搞懂了。 折半查找 先看下课本对于 折半查找的讲解。注意了,折半查找是对于有序...
基本思想:归并排序是一种典型的分治思想,把一个无序列表一分为二,对每个子序列再一分为二,继续下去,直到无法再进行划分为止。然后,就开始合并的过程,对每个子序列和另外一个子序列的元素进行比较,依次把小...
内部排序算法是指在内存中进行排序的算法,常见的内部排序算法有冒泡排序、选择排序、插入排序、归并排序、快速排序等。 在JavaScript中,我们可以使用onsubmit事件和onblur事件来实现表单校验。在下面的例子中,...
归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待...
利用java策略模式编写的一个排序方法切换,的小例子。用于学习策略模式是很好的方式。界面写的还可以,仅供大家参考学习
// 归并排序 //MergeSort( a ); // 基数排序 { SLList b; int i; b.keynum = 3, b.recnum = LENGTH;// 对3位整数进行基数排序 for ( i = 1; i ; i++ ) { b.r[i].keys[0] = objArray[i-1] % 10;//...
有插入 堆 冒泡 选择 归并 快速排序等相关例子
定义:归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子...
为例子。 1.希尔排序。 希尔排序是在插入排序上面做的升级。是先跟距离较远的进行比较的一些方法。 function shellsort(arr){ var i,k,j,len=arr.length,gap = Math.ceil(len/2),temp; while(gap>0){ for (var k...
内部排序的所有算法,而且有相关可执行例子,包括插入排序,选择排序,希尔排序,快速排序,堆排序,归并排序等,很全,很孀。
算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...
简单的归并排序实现例子
算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...
排序7.1 预备知识7.2 插入排序7.2.1 算法7.2.2 插入排序的分析7.3 一些简单排序算法的下界7.4 希尔排序7.4.1 希尔排序的最坏情形分析7.5 堆排序7.5.1 堆排序的分析7.6 归并排序7.6.1 归并排序的分析7.7 快速排序...
15个典型的递归算法的JAVA实现,求N的阶乘、欧几里德算法(求最大公约数)、斐波那契数列、汉诺塔问题、树的三种递归遍历方式、快速排序、折半查找、图的遍历、归并排序、八皇后问题(回溯、递归)、棋盘覆盖(分治,...
本文件讲了十种JAVA排序方法(冒泡(Bubble)排序——相邻交换 、选择排序——每次最小/大排在相应的位置 、插入排序——将下一个插入已排好的序列中 、壳(Shell)排序——缩小增量 、归并排序 、快速排序 、堆排序 ...