归并排序

来源:互联网 发布:用友软件购买ufsky 编辑:程序博客网 时间:2024/06/12 19:37

算法竞赛入门读后实现:

今天看书,弄懂了归并排序,把书中的代码实现以下,如下:

首先上图这图感觉非常好的说明了归并排序的过程

图片

归并排序思想

1.划分问题: 把序列分成元素个数尽量相等的两半

2.递归求解:把两半元素分别排序

3.合并问题:把连个有序表合并成一个

算法的时间复杂度: O(nlogn)  (这个我还没理解)

注意的问题

在上图中,比如说当序列变成 A[i]: 38,49,65,97         B[j] :13 ,27,76   并将A和B合并到T中

在合并的过程中,都是从A中拿出当前第i个元素和B中第j个元素比较的, 但是到了最后,肯定是某个数组全部的合并到了T中,但是另一个数组中的元素有剩余,这时间,将剩余的元素全部合并到T中(在此例中指的A,因为当B全部进到T中时,A还有97这个元素)

代码:

package bo.xing.shen.sort;import bo.xing.shen.util.CalculateTime;import bo.xing.shen.util.ReadData;import bo.xing.shen.util.SaveData;public class MergeSort {private static int[] data;private static int[] temp ;public static void main(String[] args) throws Exception {data = ReadData.readData(10000000);//对1000000条数据进行排序temp = new int[data.length];CalculateTime.start();mergeSort(0, data.length);CalculateTime.getPeriod();SaveData.writeData(data,MergeSort.class.getName());}public static void mergeSort(int x,int y){if (y-x > 1){int m = x + (y-x)/2;int p = x;int q = m;int i = x;mergeSort(x, m);mergeSort(m, y);while (p<m || q<y){if (q >=y || (p<m && data[p] <= data[q])){ // 这里是左半部分进入数组temp的条件,即要么比右边的元素小,要么右边的元素已经全部进入temp数组temp[i++] = data[p++];}else{temp[i++] = data[q++];}}for ( i=x; i<y; i++){data[i] = temp[i];}}}}

运行的时间为:1305毫秒

0 0