java内部排序之归并排序

归并排序(时间复杂度(nlogn))

时间复杂度:最好O(nlogn),最坏O(nlogn)

空间复杂度:O(n)

稳定性:稳定

思想:

假设有n个数,可看成n个有序的子序列,每个子序列长度为1,然后两两再归并,得到长度为2或者1的有序子序列。重复两两子序列归并直到一个长度为n的有序序列为止。

代码:

public static void sort(int []arr){
       int []temp = new int[arr.length];//在排序前,先建好一个长度等于原数组长度的临时数组,避免递归中频繁开辟空间
       sort(arr,0,arr.length-1,temp);
   }
   private static void sort(int[] arr,int left,int right,int []temp){
       if(left<right){
           int mid = (left+right)/2;
           sort(arr,left,mid,temp);//左边归并排序,使得左子序列有序
           sort(arr,mid+1,right,temp);//右边归并排序,使得右子序列有序
           merge(arr,left,mid,right,temp);//将两个有序子数组合并操作
       }
   }
   private static void merge(int[] arr,int left,int mid,int right,int[] temp){
       int i = left;//左序列指针
       int j = mid+1;//右序列指针
       int t = 0;//临时数组指针
       while (i<=mid && j<=right){
           if(arr[i]<=arr[j]){
               temp[t++] = arr[i++];
           }else {
               temp[t++] = arr[j++];
           }
       }
       while(i<=mid){//将左边剩余元素填充进temp中
           temp[t++] = arr[i++];
       }
       while(j<=right){//将右序列剩余元素填充进temp中
           temp[t++] = arr[j++];
       }
       t = 0;
       //将temp中的元素全部拷贝到原数组中
       while(left <= right){
           arr[left++] = temp[t++];
       }
   }
发布了59 篇原创文章 · 获赞 2 · 访问量 2063

猜你喜欢

转载自blog.csdn.net/zuodaoyong/article/details/103604221