一.2个有序数组的归并排序
A,B有序数组的归并排序就是同时从小到大的扫描2个数组,把数值小的数字赋值给一个新的数组C,依次直到A或者B内容都赋值完毕,把另一个数组剩余的值依次插入给C数组。
二.一个无序数组的归并排序
对于一个无序的数组排序,可以使用二分法,把它分成2个无序数组,然后使用递归2-》4,4-》8(个数组)的分裂,假定说只有一个元素的数组是有序的,这样最终问题将归结为解决2个有序数组的归并排序问题,即而解决问题。
- package recursive;
- //demostrate recursive merge sort
- //
- public class Darray {
- private long[]theArray; //数组
- private int nElems; //数组大小
- //
- public Darray(int max) //初始化
- {
- theArray=new long[max];
- nElems=0;
- }
- /
- public void insert(long value) //插入
- {
- theArray[nElems]=value;
- nElems++;
- }
- /
- public void display() //显示
- {
- for(int j=0;j<nElems;j++)
- System.out.print(theArray[j]+" ");
- System.out.println("");
- }
- ///
- public void mergeSort() //归并排序
- {
- long[]workSpace=new long[nElems]; //构造一个和theArray同样大小的数组
- recMergeSort(workSpace,0,nElems-1); //子归并
- }
- //
- private void recMergeSort(long[]workSpace,int lowerBound,
- int upperBound)
- {
- if(lowerBound==upperBound)//if range is 1,return itself
- return;
- else
- {
- int mid=(lowerBound+upperBound)/2;//find midpoint
- recMergeSort(workSpace,lowerBound,mid);//sort lower half
- recMergeSort(workSpace,mid+1,upperBound);//sort high half
- merge(workSpace,lowerBound,mid+1,upperBound);//归并高低两部
- }
- }
- ///
- private void merge(long[] workSpace,int lowPtr,int highPtr,int upperBound)//归并
- {
- int j=0;
- int lowerBound=lowPtr; //低端指针
- int mid=highPtr-1; //高端指针
- int n=upperBound-lowerBound+1; //总个数
- while(lowPtr<=mid&&highPtr<=upperBound) //低端指针上限为mid,高端指针上限为upperBound
- if(theArray[lowPtr]<theArray[highPtr])
- workSpace[j++]=theArray[lowPtr++];
- else
- workSpace[j++]=theArray[highPtr++];
- while(lowPtr<=mid) //高端结束,把剩余的低端数组直接赋值
- workSpace[j++]=theArray[lowPtr++];
- while(highPtr<=upperBound) //低端结束,把剩余的高端数组直接赋值
- workSpace[j++]=theArray[highPtr++];
- for(int i=0;i<n;i++) //把workSpace内存赋值给theArray
- theArray[lowerBound+i]=workSpace[i];
- }
- }
- package recursive;
- public class MergeSortApp {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- int maxSize=100;
- Darray arr;
- arr=new Darray(maxSize);
- arr.insert(64);
- arr.insert(21);
- arr.insert(33);
- arr.insert(70);
- arr.insert(12);
- arr.insert(85);
- arr.insert(44);
- arr.insert(3);
- arr.insert(99);
- arr.insert(0);
- arr.insert(108);
- arr.insert(36);
- arr.display();
- arr.mergeSort();
- arr.display();
- }
- }
结果如下:
- 64 21 33 70 12 85 44 3 99 0 108 36
- 0 3 12 21 33 36 44 64 70 85 99 108