文章标题

来源:互联网 发布:天刀女捏脸数据导入 编辑:程序博客网 时间:2024/04/30 07:58
  1. 排序思想
    归并排序实际上是分治法在排序上的应用,将一个完整的数列切割成单个的序列,再两两合并,知道最后重新合成一个完整的数列,这是数列已经是排序后的了。具体归并过程见下图
    这里写图片描述
    使用红色方框框住的就是进行合并的数列。该排序的时间复杂度是O(nlogn)
  2. 代码
package merge;import java.util.Arrays;public class MergeDemo {    public static void main(String[] args) {        int [] arr={1,3,6,85,4,5,8,6,4,6,9,0};        // 执行归并排序        mergeSort(arr,0,arr.length-1);    }    public static void mergeSort(int[] data,int left,int right){        if(left>=right){            return;        }        int mid=(left+right)/2;        //对左边数据进行划分        mergeSort(data,left,mid);        //对右边数据进行划分        mergeSort(data,mid+1,right);        // 归并排序        merge(data,left,mid,right);        //打印每一次归并排序后的结果        System.out.println(Arrays.toString(data));    }    private static void merge(int[] data, int left, int mid, int right) {        // 建立一个临时数组        int[] temp=new int[data.length];        // 中间索引 即后半段第一个索引        int center=mid+1;        // 记录临时数组开始索引        int thrid=left;        // 记录开始时的索引        int tempsize=left;        // 开始归并        while(left<=mid&&center<=right){            // 左边的元素较小            if(data[left]<=data[center]){                temp[thrid++]=data[left++];            // 左边的元素较小            }else{                temp[thrid++]=data[center++];            }        }        // 左边未取完        while(left<=mid){            temp[thrid++]=data[left++];        }        // 右边未取完        while(center<=right){            temp[thrid++]=data[center++];        }        // 临时数组的数据转给 data        while(tempsize<=right){            data[tempsize]=temp[tempsize++];        }    }}
1 0
原创粉丝点击