归并排序
归并排序是采用的分而治之的递归方式来完成数据排序的,主要是将已有序的两个子序列,合并成一个新的有序子序列。先将子序列分段有序,然后再将分段后的子序列合并成,最终完成数据的排序。
主要步骤:
- 将数据的长度从中间一分为二,分成两个子序列,执行递归操作,直到每个子序列就剩两个元素
- 然后分别对这些拆好的子序列进行归并排序。
- 将排序好的子序列再两两合并,最终合并成一个完整的排序序列。
归并过程:
- 设置两个数组分别装载左,右边排序好的数据
- 设置两个变量(快慢指针)分别指向左右数组的起始位置
- 设置一个变量指向原始数组的位置,比较左右两个数组数据的大小,小的按顺序存放在原始数组中
public static void mergeSort(int array[],int left,int right){
if(left==right){
return;
}else{
int mid=(left+right)/2;
mergeSort(array,left,mid);
mergeSort(array,mid+1,right);
merge(array,left,mid+1,right);
}
}
public static void merge(int[] array,int left,int mid,int right){
int leftSize=mid-left;
int rightSize=right-mid+1;
//生成数组
int[] leftArray=new int[leftSize];
int[] rightArray=new int[rightSize];
//填充数据
for(int i=left;i<mid;i++){
leftArray[i-left]=array[i];
}
for(int i=mid;i<=right;i++){
rightArray[i-mid]=array[i];
}
//合并
int i=0;
int j=0;
int k=left;
while(i<leftSize && j<rightSize){
if(leftArray[i]<rightArray[j]){
array[k]=leftArray[i];
k++;i++;
}else{
array[k]=rightArray[j];
k++;j++;
}
}
while(i<leftSize){
array[k]=leftArray[i];
k++;i++;
}
while(j<rightSize){
array[k]=rightArray[j];
k++;j++;
}
}
应用场景
应用场景 数据量大并且有很多重复数据,链式结构 短处 需要空间大
时间复杂度:o(n)=nlogn