?未检查 Java排序算法大整理——归并排序
2018-03-21 17:30
253 查看
1.概念
归并排序 (merge sort) 是一类与插入排序、交换排序、选择排序不同的另一种排序方法。归并的含义是将两个或两个以上的有序表合并成一个新的有序表。归并排序有多路归并排序、两路归并排序 , 可用于内排序,也可以用于外排序。这里仅对内排序的两路归并方法进行讨论。
复杂度:时间复杂度O(nlogn),空间复杂度O(n),稳定 排序算法的稳定性:如果待排序的文件中,存在有多关键码相同的元素,经过排序后这些具有相同关键码的元素之间的相对次序保持不变,则称这种排序方法是稳定的;繁殖,若具有相同关键码的元素之间的相对次序发生变化,则称这种排序方法是不稳定的。《数据结构与STL》,下面图片来自https://www.bilibili.com/video/av8957042/?p=60
2.代码以下博客的代码很好https://www.cnblogs.com/chengxiao/p/6194356.html,有三个函数,一个是合并(核心),一个是最外面的,一个是中间的,注意临时数组需要在最外面的函数中声明,避免递归中重复申请新的空间。以下视频中有详细讲解。https://www.bilibili.com/video/av8957042/?p=68
public static void main(String []args){
int []arr = {9,8,7,6,5,4,3,2,1};
Msort(arr);
System.out.println(Arrays.toString(arr));
}
public void Msort(int[] arr){
int[] temp = new int[arr.length];//在排序前,先建好一个长度等于原数组长度的临时数组,避免递归中频繁开辟空间
int left=0;
int rightEnd=arr.length-1;
MsortTemp(arr,temp,left,rightEnd);
}
//核心函数是这两个,递归式
public void MsortTemp(int[] arr,int[] temp,int left,int rightEnd){
if(left<right){
int mid = (left+rightEnd)/2;
MsortTemp(arr,temp,left,mid);//左边归并排序
MsortTemp(arr,temp,mid+1,rightEnd);//右边归并排序
merge(arr,temp,left,mid,rightEnd);//合并
}
}
public void merge(int[] arr,int[] temp,int left,int leftEnd,int rightEnd){
int len=rightEnd-left+1;
int right = leftEnd+1;
int t = left;
while (left<=leftEnd && right<=rightEnd){
if(arr[left]<=arr[right]){
temp[t++] = arr[left++];
}else {
temp[t++] = arr[right++];
}
}
while(left<=leftEnd){//将左边剩余元素填充进temp中
temp[t++] = arr[left++];
}
while(right<=rightEnd){//将右序列剩余元素填充进temp中
temp[t++] = arr[right++];
}
for(int i=0;i<len;i++){//将temp中的元素全部拷贝到原数组中
arr[i]=temp[i];
}
}
归并排序 (merge sort) 是一类与插入排序、交换排序、选择排序不同的另一种排序方法。归并的含义是将两个或两个以上的有序表合并成一个新的有序表。归并排序有多路归并排序、两路归并排序 , 可用于内排序,也可以用于外排序。这里仅对内排序的两路归并方法进行讨论。
复杂度:时间复杂度O(nlogn),空间复杂度O(n),稳定 排序算法的稳定性:如果待排序的文件中,存在有多关键码相同的元素,经过排序后这些具有相同关键码的元素之间的相对次序保持不变,则称这种排序方法是稳定的;繁殖,若具有相同关键码的元素之间的相对次序发生变化,则称这种排序方法是不稳定的。《数据结构与STL》,下面图片来自https://www.bilibili.com/video/av8957042/?p=60
2.代码以下博客的代码很好https://www.cnblogs.com/chengxiao/p/6194356.html,有三个函数,一个是合并(核心),一个是最外面的,一个是中间的,注意临时数组需要在最外面的函数中声明,避免递归中重复申请新的空间。以下视频中有详细讲解。https://www.bilibili.com/video/av8957042/?p=68
public static void main(String []args){
int []arr = {9,8,7,6,5,4,3,2,1};
Msort(arr);
System.out.println(Arrays.toString(arr));
}
public void Msort(int[] arr){
int[] temp = new int[arr.length];//在排序前,先建好一个长度等于原数组长度的临时数组,避免递归中频繁开辟空间
int left=0;
int rightEnd=arr.length-1;
MsortTemp(arr,temp,left,rightEnd);
}
//核心函数是这两个,递归式
public void MsortTemp(int[] arr,int[] temp,int left,int rightEnd){
if(left<right){
int mid = (left+rightEnd)/2;
MsortTemp(arr,temp,left,mid);//左边归并排序
MsortTemp(arr,temp,mid+1,rightEnd);//右边归并排序
merge(arr,temp,left,mid,rightEnd);//合并
}
}
public void merge(int[] arr,int[] temp,int left,int leftEnd,int rightEnd){
int len=rightEnd-left+1;
int right = leftEnd+1;
int t = left;
while (left<=leftEnd && right<=rightEnd){
if(arr[left]<=arr[right]){
temp[t++] = arr[left++];
}else {
temp[t++] = arr[right++];
}
}
while(left<=leftEnd){//将左边剩余元素填充进temp中
temp[t++] = arr[left++];
}
while(right<=rightEnd){//将右序列剩余元素填充进temp中
temp[t++] = arr[right++];
}
for(int i=0;i<len;i++){//将temp中的元素全部拷贝到原数组中
arr[i]=temp[i];
}
}
相关文章推荐
- java小程序整理及排序算法
- 老生常谈 排序算法(JAVA)-- 归并排序
- Java排序算法--归并排序(MergeSort)
- 排序算法之归并排序(JAVA)
- 【常用排序算法】归并排序(Java实现)
- 排序算法java 二 --基数排序、归并排序
- 排序算法复习(Java实现)(二): 归并排序,堆排序,桶式排序,基数排序
- 《排序算法》——归并排序,插入排序(Java)
- 排序算法--归并排序Java实现 .
- 排序算法之两路归并排序(Java)
- 排序算法总结(二)-------选择,堆,冒泡,快速,归并排序(java实现)
- 五十道编程小题目 --- 28 八大排序算法 java 之 07归并排序
- JAVA 排序算法整理总结,看了这个保你理解
- 排序算法之归并排序(JAVA)
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 排序算法整理之归并排序
- 排序算法之归并排序(JAVA)
- Java实现排序算法——归并排序
- 排序算法(Java语言)——归并排序
- 排序算法---归并排序 (java)