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
- 浏览 1053
- 评论(0)
- 论坛回复 / 浏览 (0 / 2394)
- 查看更多
相关推荐
在这个例子中,`mergeSort()`函数实现了归并排序,通过递归地将序列一分为二,直到每个子序列只剩下一个元素,然后调用`merge()`函数进行合并操作。归并排序的优点是稳定性,即相等的元素在排序后的相对位置不会改变...
归并排序(Merge Sort)是一种高效的排序算法,其主要基于分治法(Divide and Conquer)的思想。在C++中实现归并排序,我们需要理解以下几个关键知识点: 1. **分治法**:分治法是计算机科学中常用的一种算法设计...
以下是一个简单的归并排序算法的伪代码: ```python def merge_sort(arr): # 基线条件:如果数组只包含一个元素,它已经有序 if len(arr) return arr # 将数组分为两半 mid = len(arr) // 2 left_half = ...
归并排序是一种高效的排序算法,基于“分而治之”的思想。它的基本步骤包括分割、合并和递归。下面将详细介绍归并排序的工作原理、C++实现方式以及它在算法设计与分析中的重要性。 首先,理解归并排序的分治策略。...
快速排序、归并排序、堆排序的数组和单链表实现 ...在实际应用中,快速排序、归并排序和堆排序都是非常有用的排序算法,它们可以根据不同的情况选择合适的排序算法,从而提高排序的效率和稳定性。
在这个例子中,我们探讨了如何运用策略模式来实现不同的排序算法,如快速排序、归并排序和冒泡排序。首先,我们需要理解策略模式的核心概念。 策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以互相...
在这个例子中,代码使用了`timsort`的思路,这是一种自适应的排序算法,结合了插入排序和归并排序的优点,能够处理部分有序的数据,性能上优于纯归并排序。但是,代码中并没有具体体现`timsort`的全部特性,例如它的...
今天学了折半查找算法,折半查找是蛮简单的,但是归并排序我就挺懵比,看教材C语言写的归并排序看不懂,后来参考了别人的博客,终于搞懂了。 折半查找 先看下课本对于 折半查找的讲解。注意了,折半查找是对于有序...
归并排序是一种高效的排序...总结来说,C语言实现的归并排序算法通过分治策略和归并操作,提供了一种高效且稳定的排序方法。虽然它比快速排序略慢,但在最坏情况下仍然保持良好的性能,且不依赖于输入数据的特定模式。
归并排序(Merge Sort)是一种基于分治策略的高效排序算法。它的基本思想是将待排序的元素序列分成两个或更多的子序列,分别对每个子序列进行排序,然后将排好序的子序列合并成一个有序序列。这个过程可以递归进行,...
归并排序是一种高效的排序算法,它的基本思想源于“分治法”(Divide and Conquer)。这个策略将复杂的问题分解成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并...
TimSort 是一种混合排序算法,由插入排序和归并排序组合而成。它的出现是为了解决快速排序的不稳定性问题。TimSort 的作者 Tim Peters 在 2001 年为 Python 编写了该算法,后来被 Java、Android 和 GNU Octave 等...
在给定的压缩包文件`sort_merge`中,可能包含了这个2-路归并排序算法的源代码实现,你可以通过查看这些文件来深入理解其工作原理和细节。在实际编程中,了解并掌握归并排序可以帮助你更好地处理大规模数据的排序问题...
快速排序和归并排序都是分治算法的典型例子。分治算法通常用于解决递归性质的问题,如计算斐波那契数列、求最大子数组和等。 4. **回溯算法**:回溯是一种试探性的解决问题的方法,当遇到困难时(如无解或找到所有...
【排序算法总结】 排序算法是计算机科学中处理数据排列...在实际应用中,可能会根据数据特性选择更高效的排序算法,如快速排序、归并排序、堆排序等。理解并掌握这些基础排序算法对于优化程序性能和解决问题至关重要。
归并排序算法 参数: arr -- 待排序的整数数组 返回值: sorted_arr -- 排序后的整数数组 描述: 采用分治策略,将数组分解成更小的子数组,递归地对子数组进行排序,并将已排序的子数组合并成一个大的...
归并排序(Merge Sort)是一种基于分治策略的高效排序算法。它的主要思想是将待排序的序列分成两部分,分别进行排序,然后再合并这两部分,以得到完整的有序序列。这个过程可以递归地应用于每一部分,直到每个部分只...
本题要求用C++编写一个非递归的归并排序算法,同时在每趟排序结束后输出排序结果。 首先,我们要理解归并排序的基本步骤: 1. **分割**:将原始数组分为两半,这个过程在非递归版本中通过不断将长度翻倍实现。 2. *...
插入排序是一种简单直观的排序算法,它的工作原理类似于人们平时整理扑克牌的过程。算法将数组分为已排序和未排序两部分,每次从未排序部分取出一个元素,插入到已排序部分的正确位置。Java实现时,通常使用一个...
在"排序与查找算法例子"这个上机作业中,你可能会接触到这些算法的实现代码,理解它们的工作原理,并通过实际操作来观察各种算法的性能差异。这有助于加深对算法的理解,提升编程能力。 对于初学者来说,实现这些...