MergeImpl

xiaoxiao2026-05-26  1

package com.liuxt.sort.impl;

import com.liuxt.sort.Sort;

 

public class MergeImpl implements Sort {

 /*  * 归并排序的算法:  *   *  (non-Javadoc)  * @see com.liuxt.sort.Sort#sortData(int[])  */ public void sortData(int[] data1) {  int length=1,k=0; /**length为分段大小,最开始设置为1**/  int n=data1.length;    int[] data2;  data2=new int[n];    while(length<n)  {   if(k==0) Msort(data1,data2,n,length);   else Msort(data2,data1,n,length);   length*=2; /**每完成一趟归并,所有的有序分段的长度翻一倍**/   k=1-k;  }  if(k==1) /**归并结果为基数,排序结果放在data2中,再将结果复制到data1中**/  for(k=0;k<n;++k)   data1[k]=data2[k];   }

 /**  * 函数的功能:  *   将data1中相邻的两个分段合并为一个有序段,归并的结果放在data2中。  *   data1中的分段情况如下:  *   data1[0...len-1],data1[len....2*len-1],,,data1[(I-1)*len...I*len-1]  *   I为分组号  *     *   * @param data1  * @param data2  * @param n  * @param len  */ private void Msort(int[] data1, int[] data2, int n, int len) {  int start_p,end_p;  start_p=0; /**从下标为0的元素开始,**/  while(start_p+len<n){ /**取相邻的两个有序段开始合并**/   end_p=start_p+2*len-1;   if(end_p>=n) end_p=n-1;   /**调用合并函数。开始,start_p=0,len=1,end_p=1    两两合并为一个有序段,结果存在data2中 **/   Merge(data1,data2,start_p,start_p+len-1,end_p);    start_p=end_p+1;  }  if(start_p<n){   /**直接将剩下的一个有序段的元素复制到data2中。**/   for(;start_p<n;start_p++)    data2[start_p]=data1[start_p];  } }

 /**  * 将分别有序的data1[s,,m]和data1[m+1..n]归并为有序的data2[s...n]  *   * @param data1  * @param data2  * @param s  * @param m  * @param n  */ private void Merge(int[] data1, int[] data2, int s, int m, int n) {  int i,j,k;  for(i=m+1,k=s;s<=m && i<=n;++k)  {   if(data1[s]<data1[i])     data2[k]=data1[s++];   else data2[k]=data1[i++];  }  for(j=s;j<=m;++j,++k)   data2[k]=data1[j];  for(j=i;j<=n;++j,++k)   data2[k]=data1[j]; }}

相关资源:敏捷开发V1.0.pptx
转载请注明原文地址: https://www.6miu.com/read-5049454.html

最新回复(0)