归并排序

来源:互联网 发布:linux find 模糊查询 编辑:程序博客网 时间:2024/05/18 01:22
public class MergingSort {    public static void main(String[] args) {        int[] data = {8,5,6,4,2,9,7,3,1};        mergeSort(data,0,data.length - 1);    }       public static void mergeSort(int[] data, int low, int high){        int mid = (low + high) / 2;        if(low<high){            mergeSort(data, low, mid);            mergeSort(data, mid + 1, high);            merge(data,low,mid,high);            print(data);        }    }    /**     * 归并操作     * @param data 总数组     * @param low 归并子表的左边子表的第一个元素在总数组中的下标     * @param mid 归并子表的左边子表的最后一个元素在总数组中的下标,mid+1是 归并子表的右边子表的第一个元素在总数组中的下标     * @param high 归并子表的右边子表的最后一个元素在总数组中的下标     */    public static void merge(int[]data, int low, int mid, int high){        //low到high包含了两个子表的数据,mid是第一个子表数据最后一个元素的下标        //创建一个临时数组大小为需要归并的两个子表的总和长度        int[] tmpArr = new int[high-low+1];        int t = 0;        //leftPoint左指针开始指向左边子表的第一个元素,后面的操作会让这个指针右移,也就是会按1的数值增加.        int leftPoint = low;        //rightPoint右指针指向右边第一个元素,和左指针一样,会向右移动        int rightPoint = mid + 1;        //左指针移动的过程中不能超过左子表的最后一个数的下标,同意指针移动的过程中不能超过右子表的最后一个数的下标        while(leftPoint <= mid && rightPoint <= high){            //比较左右指针指向数的大小,将小的数放到临时数组里            if(data[leftPoint] < data[rightPoint]){                tmpArr[t] = data[leftPoint];                t++;                leftPoint++;            } else {                tmpArr[t] = data[rightPoint];                t++;                rightPoint++;            }        }        //如果左指针还未移动到mid的位置,说明左子表还有数据没有放入到临时表中,将剩余的数据放入到临时表中        while(leftPoint <= mid){            tmpArr[t] = data[leftPoint];            t++;            leftPoint++;        }        //同理右指针和左指针一样,但实际上,这两个while只会执行一个。        while(rightPoint <= high){            tmpArr[t] = data[rightPoint];            t++;            rightPoint++;        }        //将已经排序好的临时数组赋值到原数组中        for(int i = 0; i < tmpArr.length; i++){            data[low + i] = tmpArr[i];        }    }    public static void print(int[] data){        for(int i = 0;i<data.length;i++){            System.out.print(data[i] + "\t");        }        System.out.println();    }}
原创粉丝点击