排序算法之归并算法

来源:互联网 发布:sql 2005什么用 编辑:程序博客网 时间:2024/05/01 01:10
归并多用于数据放在不同的地方(数组,文件 ,网络)我们要将其合在一起汇总排序。这些不同地方的数据是有序的,我们再造一个空间是两个数据的长度之和(这里我写的是二路归并)。每次拿两个数据的第一个来比较,谁小依次就放到新开的空间当中,继续比较放值。(每次都是两个数据的头来比较,比一个放一个,边读边比,速度很快的)。这里还有一个很好玩的东西,那就是用一个临界点来控制两个递归,一个分解递归一个合并递归。得意稍微转了几个圈,有点晕快哭了。最后把辅助数组的值写到所要的数组当中。
package cn.hncu.sorts;public class SortWay2 {//输出函数private static void print(int[] a) {for(int num:a){System.out.print(num+" ");}System.out.println();}//交换数组位置函数private static void swap(int[] a, int j, int i) {int temp;temp=a[i];a[i]=a[j];a[j]=temp;}private static void mergeSort(int[] a, int left, int right) {if(left<right){//卫条件防护//1先分解  //把整个数组分解成:[left,mid] 和 [mid+1, right]  ----mid=(left+right)/2int mid=(left+right)/2;mergeSort(a,left,mid);mergeSort(a,mid+1,right);//2归并int[] b=new int[a.length];merge(a,b,left,mid,right);//把辅助数组b中的值写到a数组当中coppyArray(a,b,left,right);}}private static void coppyArray(int[] a, int[] b, int left, int right) {for(int i=left;i<=right;i++){a[i]=b[i];}}private static void merge(int[] a, int[] b, int left, int mid, int right) {int p=left;//游标,遍历a[left,mid]int r=mid+1;//游标,遍历a[mid+1,right]int k=left;//游标,遍历b[].合并后结果数组。指定当前判断之后所选中的元素应该放在哪个位置while(p<=mid&&r<=right){if(a[p]<a[r]){b[k]=a[p++];}else{b[k]=a[r++];}k++;}//把其中一个子序列当中剩余的元素直接照搬到归并结果数组当中if(p>mid){//左序列已经完成了,还剩右序列照搬进b数组for(int i=r;i<=right;i++){b[k++]=a[i];}}else{//右序列已经完成,还剩左序列照搬b数组for (int i = p; i <=mid; i++) {b[k++]=a[i];}}}public static void main(String[] args) {int[] a={21,22,5,7,86,57,9,-2,37,-8};//归并排序mergeSort(a,0,a.length-1);print(a);}}


0 1
原创粉丝点击