TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
并归排序:
将两个或两个以上的有序数组组合成一个新的有序数组,叫并归排序
排序过程
1、 设初始数组有n个数据,则可看成n个有序的子数组,
每个子数组长度为1;
2、 两两合并,得到n/2或n/2+1 个长度为2 或1 的有序子数组;
3、 再两两合并,…… 如此重复,直至得到一个长度为n 的
有序数组为止。

下面是并归排序的递归实现:- class DArray
- {
- private long[] theArray; // ref to array theArray
- private int nElems; // number of data items
- public DArray(int max) // constructor
- {
- theArray = new long[max]; // create array
- nElems = 0;
- }
- public void insert(long value) // put element into array
- {
- theArray[nElems] = value; // insert it
- nElems++; // increment size
- }
- public void display() // displays array contents
- {
- for(int j=0; j< nElems; j++) // for each element,
- System.out.print(theArray[j] + " "); // display it
- System.out.println("");
- }
- public void mergeSort() // called by main()
- { // provides workspace
- long[] workSpace = new long[nElems];
- recMergeSort(workSpace, 0, nElems-1);
- }
- private void recMergeSort(long[] workSpace, int lowerBound,
- int upperBound)
- {
- if(lowerBound == upperBound) // if range is 1,
- return; // no use sorting
- else
- { // find midpoint
- int mid = (lowerBound+upperBound) / 2;
- // sort low half
- recMergeSort(workSpace, lowerBound, mid);
- // sort high half
- recMergeSort(workSpace, mid+1, upperBound);
- // merge them
- merge(workSpace, lowerBound, mid+1, upperBound);
- } // end else
- } // end recMergeSort()
- private void merge(long[] workSpace, int lowPtr,
- int highPtr, int upperBound)
- {
- int j = 0; // workspace index
- int lowerBound = lowPtr;
- int mid = highPtr-1;
- int n = upperBound-lowerBound+1; // # of items
- while(lowPtr <= mid && highPtr <= 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(j=0; j< n; j++)
- theArray[lowerBound+j] = workSpace[j];
- } // end merge()
-
- } // end class DArray
- class MergeSortApp
- {
- public static void main(String[] args)
- {
- int maxSize = 100; // array size
- DArray arr; // reference to array
- arr = new DArray(maxSize); // create the array
- arr.insert(64); // insert items
- 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(); // display items
- arr.mergeSort(); // merge sort the array
- arr.display(); // display items again
- } // end main()
- } // end class MergeSortApp
复制代码 运行结果:
C:java>java MergeSortApp
64 21 33 70 12 85 44 3 99 0 108 36
0 3 12 21 33 36 44 64 70 85 99 108
源码下载:http://file.javaxxz.com/2014/10/30/235930546.zip |
|