同事写的二分归并排序
2016-02-29 12:52
302 查看
package Sort;
/**
* 二分归并排序,平均划分数组,递归划分,合并
*
* @author lucky-django
*
*/
public class MergeSort {
/**
* 合并操作
*/
public void merge(int[] array, int startIndex, int midIndex, int endIndex) {
int x = midIndex - startIndex;// 前一个数组的最大index
int y = endIndex - midIndex - 1;// 后一个数组的最大index
int[] firstArray = new int[midIndex - startIndex + 1];
int[] secondArray = new int[endIndex - midIndex];
// 将原数组复制到两个子数组中
for (int i = 0; i <= x; i++) {
firstArray[i] = array[i + startIndex];
}
for (int i = 0; i <= y; i++) {
secondArray[i] = array[i + midIndex + 1];
}
int i = 0, j = 0, k = startIndex;
while (i <= x && j <= y) {
if (firstArray[i] <= secondArray[j]) {
array[k] = firstArray[i];
i++;
} else {
array[k] = secondArray[j];
j++;
}
k++;
}
if (i > x) {
for (; j <= y; j++) {
array[k] = secondArray[j];
k++;
}
} else {
for (; i <= x; i++) {
array[k] = firstArray[i];
k++;
}
}
}
/**
* 划分+合并
*/
public void mergeSort(int[] array, int startIndex, int endIndex) {
if (startIndex >= endIndex) {
return;
}
int mid = (startIndex + endIndex) / 2;
mergeSort(array, startIndex, mid);
mergeSort(array, mid + 1, endIndex);
merge(array, startIndex, mid, endIndex);
}
public static void main(String[] args) {
int[] array = new int[] { 8, 2, 4, 6 };
MergeSort sort = new MergeSort();
sort.mergeSort(array, 0, 3);
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
}
/**
* 二分归并排序,平均划分数组,递归划分,合并
*
* @author lucky-django
*
*/
public class MergeSort {
/**
* 合并操作
*/
public void merge(int[] array, int startIndex, int midIndex, int endIndex) {
int x = midIndex - startIndex;// 前一个数组的最大index
int y = endIndex - midIndex - 1;// 后一个数组的最大index
int[] firstArray = new int[midIndex - startIndex + 1];
int[] secondArray = new int[endIndex - midIndex];
// 将原数组复制到两个子数组中
for (int i = 0; i <= x; i++) {
firstArray[i] = array[i + startIndex];
}
for (int i = 0; i <= y; i++) {
secondArray[i] = array[i + midIndex + 1];
}
int i = 0, j = 0, k = startIndex;
while (i <= x && j <= y) {
if (firstArray[i] <= secondArray[j]) {
array[k] = firstArray[i];
i++;
} else {
array[k] = secondArray[j];
j++;
}
k++;
}
if (i > x) {
for (; j <= y; j++) {
array[k] = secondArray[j];
k++;
}
} else {
for (; i <= x; i++) {
array[k] = firstArray[i];
k++;
}
}
}
/**
* 划分+合并
*/
public void mergeSort(int[] array, int startIndex, int endIndex) {
if (startIndex >= endIndex) {
return;
}
int mid = (startIndex + endIndex) / 2;
mergeSort(array, startIndex, mid);
mergeSort(array, mid + 1, endIndex);
merge(array, startIndex, mid, endIndex);
}
public static void main(String[] args) {
int[] array = new int[] { 8, 2, 4, 6 };
MergeSort sort = new MergeSort();
sort.mergeSort(array, 0, 3);
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
}
相关文章推荐
- LinearLayout 动态添加子Button,并自动换行
- 体检套餐管理系统的综合版
- ClipDrawable的使用--慢慢展开的图片
- mybatis逆向工程
- leetcode-- Lowest Common Ancestor of a Binary Search Tree
- 大数据论坛
- ASCII码对照表
- ABAP - 日期格式转换 & ABAP经常使用日期处理函数
- HBase快照、Snapshots 淘宝快照
- asp.net 母版页使用详解
- 矩形
- Netmap 高性能网络I/O框架
- 如何诊断 11.2 集群节点驱逐问题 (文档 ID 1674872.1) 转到底部转到底部
- Python中用format函数格式化字符串的用法
- 解决android studio报错问题( Failed to complete Gradle ...
- 常用算法参考
- UINavigationController之Toolbar+ToolbarItems
- 处理 Oracle 块损坏 (文档 ID 1526911.1)
- 同事写的快排算法
- 两个栈模拟一个数列