归并排序

[url] http://baike.baidu.com/view/90797.htm[/url]

[color=red] 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。[/color]

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
  将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。

算法描述
[color=red]  归并操作的工作原理如下:
  申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
  设定两个指针,最初位置分别为两个已经排序序列的起始位置
  比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
  重复步骤3直到某一指针达到序列尾
  将另一序列剩下的所有元素直接复制到合并序列尾[/color]

/**
* @author lgli
*
*/
public class MergeSortTest
{

/**
* @param args
*/
public static void main(String[] args)
{
int[] data =
{ 1, 15, 24, 26, 58, 45, 14, 15, 14, 74 };
mergeSort(data,0, data.length-1);
for (int i = 0; i < data.length; i++)
{
System.out.println(data[i]);
}

// int[] sortData1 =
// { 1, 55, 66, 130 };
// int[] sortData2 =
// { 10, 15, 23, 200 };
// int[] merge = mergeSort1(sortData1, sortData2);
// for (int i = 0; i < merge.length; i++)
// {
// System.out.println(merge[i]);
// }
}

private static void mergeSort(int[] data,int low,int high)
{
if (low<high)
{
mergeSort(data,low,(low+high)/2);
mergeSort(data,(low+high)/2+1,high);
merge(data,low,(low+high)/2,high);
}
}

private static void merge(int[] data,int low,int mid,int high)
{
int[] sortedData=new int[high-low+1];
int tempLow=low;
int tempMid=mid+1;
int index=0;
for ( ; tempLow <= mid&&tempMid<=high;)
{
if (data[tempLow] <= data[tempMid])
{
sortedData[index++]=data[tempLow++];
}else
{
sortedData[index++]=data[tempMid++];
}

}

while (tempLow <= mid)
{
sortedData[index++] = data[tempLow++];

}

while (tempMid <= high)
{
sortedData[index++] = data[tempMid++];
}

for (int i = 0; i < sortedData.length; i++)
{
data[low+i]=sortedData[i];
}
}

public static int[] mergeSort1(int[] sortData1, int[] sortData2)
{
int[] temp = new int[sortData1.length + sortData2.length];
int i = 0, j = 0, iter = 0;
for (; i < sortData1.length && j < sortData2.length;)
{
if (sortData1[i] <= sortData2[j])
{
temp[iter] = sortData1[i];
iter++;
i++;
}
else
{
temp[iter] = sortData2[j];
iter++;
j++;
}
}
for (; i < sortData1.length; i++, iter++)
{
temp[iter] = sortData1[i];
}
for (; j < sortData2.length; j++, iter++)
{
temp[iter] = sortData2[j];
}
return temp;
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值