public class MergeSort {
public static void mergeSort(int[] data) {
System.out.println("开始排序:");
sort(data, 0, data.length - 1);
}
/*
* 将索引从left到right范围的数组元素进行归并排序 data 待排序数组 left 待排序数组的第一个元素索引 right
* 待排序数组的最后一个元素索引
*/
private static void sort(int[] data, int left, int right) {
// TODO Auto-generated method stub
if (left < right) {
// 找出中间索引
int center = (left + right) / 2;
// 对左边数组进行递归
sort(data, left, center);
// 对右边数组进行递归
sort(data, center + 1, right);
// 合并
merge(data, left, center, right);
}
}
/*
* 将两个数组进行归并,归并前两个数组已经有序,归并后依然有序 data 数组对象 left 左数组的第一个元素的索引 center
* 左数组的最后一个元素的索引,center+1是右数组第一个元素的索引 right 右数组的最后一个元素的索引
*/
private static void merge(int[] data, int left, int center, int right) {
// TODO Auto-generated method stub
int[] tmpArr = new int[data.length];
int mid = center + 1;
// third记录中间数组的索引
int third = left;
int tmp = left;
while (left <= center && mid <= right) {
// 从两个数组中取出最小的放入中间数组
if (data[left]<=(data[mid])) {
tmpArr[third++] = data[left++];
} else {
tmpArr[third++] = data[mid++];
}
}
// 剩余部分依次放入中间数组
while (mid <= right) {
tmpArr[third++] = data[mid++];
}
while (left <= center) {
tmpArr[third++] = data[left++];
}
// 将中间数组中的内容复制回原数组
while (tmp <= right) {
data[tmp] = tmpArr[tmp++];
}
System.out.println(Arrays.toString(data));
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] data = {1,33,12,10,8,0,89,100,20,23,98};
System.out.println("排序之前:\n" + Arrays.toString(data));
mergeSort(data);
System.out.println("排序之后:\n" + Arrays.toString(data));
}
}
分享到:
相关推荐
归并排序,比较高效的排序算法之一。这是一个例子,一个关于归并排序的例子。
用C++实现归并排序,题目基于MIT的算法导论中的第二章中的归并排序算法要求,visual studio 2010 实现
定义:归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子...
C#九种排序法例子(冒泡排序,选择排序,插入排序,希尔排序,堆排序,快速排序,归并排序,基数排序,计数排序)
今天学了折半查找算法,折半查找是蛮简单的,但是归并排序我就挺懵比,看教材C语言写的归并排序看不懂,后来参考了别人的博客,终于搞懂了。 折半查找 先看下课本对于 折半查找的讲解。注意了,折半查找是对于有序...
归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待...
// 归并排序 //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;//...
基本思想:归并排序是一种典型的分治思想,把一个无序列表一分为二,对每个子序列再一分为二,继续下去,直到无法再进行划分为止。然后,就开始合并的过程,对每个子序列和另外一个子序列的元素进行比较,依次把小...
利用java策略模式编写的一个排序方法切换,的小例子。用于学习策略模式是很好的方式。界面写的还可以,仅供大家参考学习
有插入 堆 冒泡 选择 归并 快速排序等相关例子
简单的归并排序实现例子
冒泡排序,归并排序,插入排序,快速排序, 包含以上四种排序的实现函数,可以直接调用。 适合初学者学习。
为例子。 1.希尔排序。 希尔排序是在插入排序上面做的升级。是先跟距离较远的进行比较的一些方法。 function shellsort(arr){ var i,k,j,len=arr.length,gap = Math.ceil(len/2),temp; while(gap>0){ for (var k...
基本的几种排序方法的例子,包含冒泡 快速排序 直接排序 归并排序 希尔排序 堆排序 基数排序
内部排序的所有算法,而且有相关可执行例子,包括插入排序,选择排序,希尔排序,快速排序,堆排序,归并排序等,很全,很孀。
归并排序; 分配类排序; 一、插入类排序 基本思想是:在一个已经排好序的序列中,每一步都将下一个待排序的记录插入到已排好序的记录中,直到所有待排序的记录全部插入为止。 插入类排序又分为三大类: 直接插入...
* 数据结构中的所有排序算法(冒泡排序,堆排序,直接插入排序,二路归并排序,快速排序,基数排序,直接选择排序,希尔排序)的例子; * 丰富的数组,位,指针,枚举,结构体,联合体等操作的例子; * 一个...
* 数据结构中的所有排序算法(冒泡排序,堆排序,直接插入排序,二路归并排序,快速排序,基数排序,直接选择排序,希尔排序)的例子; * 丰富的数组,位,指针,枚举,结构体,联合体等操作的例子; * 一个...
易语言官方支持库以及网上流传的很多模块中的很多命令或...当前已支持算法:快速排序、插入排序、堆排序、归并排序、取最大、取最小、向下取整、向上取整、反转字节集、反转文本、反转数组、扩展欧几里得、中国剩余定