十大排序之归并排序(六)

归并排序是一种高效、通用、基于比较的排序算法。此外,归并排序还是稳定的,因为相同元素的相对次序在排序后不会发生变化。
时间复杂度:O(nlgn)
在这里插入图片描述
思路:将一个数组先分成两份,再分成四分,依次向下推,将每个部分分别排序,将排好序的各个部分再进行合并,得到排好序的数组
代码思路:将数组分为左右两个数组,递归调用并进行排序分别排序完成后,使用辅助的合并函数将两个有序的子数组合并成一个整体有序的数组
代码:

package 练习;
import java.util.*;
public class App {
 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);//右排序
   marge(arr,left,mid,right,temp);//合并
  }
 }
 private static void marge(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[t++]=arr[i++];
  }
  while(j<=right) {//左边取完,将右边的填入
   temp[t++]=arr[j++];
  }
  t=0;//将t复原,保证下次正常使用
  while(left<=right) {//将temp中的数据传入arr中保证temp的再次使用
   arr[left++]=temp[t++];
  }
 }
 public static void main(String[] args) {
  int arr[]= {23,45,675,23,76,23,8,34};
  sort(arr);
  System.out.println(Arrays.toString(arr));
 }
}

感受:感觉这个排序的思路比较简单,但是它的代码相对来说比较复杂,有点难理解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值