归并排序中的“归并”的意思是将两个或者两个以上的有序表组合成一个新的有序表。他的实现无论是顺序存储结构还是链表结构,都可以在O(m+n)的时间级上实现。
复杂度:
时间复杂度:O(nlogn)
空间复杂度:O(n)
用途:
1、排序(速度仅次于快速排序,但较稳定)
2、求逆序对数
在实现单数组的归并排序之前,首先了解一下双数组的归并排序
这个双数组归并的前提是两个数组a和b都是已经排序好的
package sort;
import java.util.Arrays;
public class Test1 {
public static void main(String args[])
{
int a[]={1,2,3,4,6,7,8,10};
int b[]={1,2,5,9};
int c[] = new int[a.length+b.length];
mergeSort(a,a.length,b,b.length,c);
System.out.println(Arrays.toString(c));
}
public static void mergeSort(int a[],int n,int b[],int m,int c[])
{
int i,j,k;
i=j=k=0;
//只有满足i<n&&j<m才执行,分别扫描两个数组,将数组中的元素进行对比,从小到大赋值给临时数组c
while(i<n&&j<m)
{
if(a[i]<b[j])
c[k++]=a[i++];
else
c[k++]=b[j++];
}
//将剩余的a数组的元素放入c中
while(i<n)
{
c[k++]=a[i++];
}
//将剩余的b数组的元素放入c中
while(j<m)
{
c[k++]=b[j++];
}
}
}
运行结果如下:
[1, 1, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10]
下面开始实现单数组的归并排序算法
例如:49 38 65 97 76 13 27
思想:首先将数组中个单独的一个元素作为一个已经排序好的序列,然后,将两两相邻的元素进行归并排序,依次类推,直到最后归并为一个排序好的序列
如上图:
首先将每个元素作为一个已经排序好的序列,一共7个序列
然后,将每两个相邻的序列归并为一个序列,如49 38归并排序后变成 38 49,依次分成了4个序列,然后再将之前已经排序好的两个相邻的序列进行排序,变成2个序列,每个序列都是排序好的,最后归并为一个排序好的序列
实现代码:
package sort;
import java.util.Arrays;
public class MergeSort {
public static void main(String args[])
{
int[] array = {49,38,65,97,76,13,27};
System.out.println(Arrays.toString(array));
System.out.println("---------排序前-------------");
mergeSort(array,0,array.length-1);
System.out.println("---------排序后-------------");
System.out.println(Arrays.toString(array));
}
/**
* 这里依然需要递归来达到数组元素的排序,如果有两个已有元素的数组的话,就不用这么麻烦您了
* 不过这种归并排序依然是效率最好的排序方法之一,而且还是稳定的(相比快速排序,快速排序不稳定)
*/
public static void mergeSort(int array[],int low,int high)
{
if(low<high)
{
mergeSort(array,low,(low+high)/2);//左边排序
mergeSort(array,(low+high)/2+1,high);//右边排序
merge(array,low,(high+low)/2,high);//将两个序列归并为一个序列
System.out.println(Arrays.toString(array));
}
}
public static void merge(int array[],int low,int mid,int high)
{
int temp[]=new int[high-low+1];
int i = low;
int j = mid+1;
int k=0;
/**
* 将array数组分成两个数组来扫描,每一次都会将前后相邻的两个有序的序列归并为一个有序的序列
*/
while(i<=mid&&j<=high)
{
if(array[i]<=array[j])
temp[k++]=array[i++];
else
temp[k++]=array[j++];
}
//下面这两种while循环每次只执行其中一个
//将剩余的array[i]存入temp中
while(i<=mid)
{
temp[k++]=array[i++];
}
//将剩余的array[j]存放到temp中
while(j<=high)
{
temp[k++]=array[j++];
}
for(int m=0;m<temp.length;m++)
{
array[low+m]=temp[m];
}
}
}
运行结果如下:
[49, 38, 65, 97, 76, 13, 27]
---------排序前-------------
[38, 49, 65, 97, 76, 13, 27]
[38, 49, 65, 97, 76, 13, 27]
[38, 49, 65, 97, 76, 13, 27]
[38, 49, 65, 97, 13, 76, 27]
[38, 49, 65, 97, 13, 27, 76]
[13, 27, 38, 49, 65, 76, 97]
---------排序后-------------
[13, 27, 38, 49, 65, 76, 97]
- 大小: 4.8 KB
分享到:
相关推荐
归并排序
Java常用排序算法-归并排序 归并排序是一种分治思想的排序算法,其基本思想是将待排序的数组分成若干个子序列,每个子序列都是有序的,然后再将子序列合并成一个有序的数组。这种算法的时间复杂度为O(n log n),...
归并排序(Merge Sort)是一种高效的、稳定的排序算法,它采用了分治法(Divide and Conquer)的设计理念。在Python中实现归并排序,我们可以将一个大问题分解为两个或多个相同或相似的小问题,然后分别解决这些小...
归并排序算法是一种高效的排序算法,它的工作原理是通过将数组分为两个部分,然后将每个部分排序,最终合并两个部分以达到排序的目的。归并排序算法的时间复杂度为O(n log n),因此它适合大规模的数据排序。 6.堆...
归并排序(Merge Sort)是一种基于分治策略的高效排序算法,它的主要思想是将大问题分解成小问题,然后逐个解决小问题,最后再将解决好的小问题合并成解决大问题的答案。这个过程可以形象地比喻为将两个已排序的列表...
本文将对快速排序、归并排序、堆排序等常见排序算法进行比较和分析,探讨它们的优缺点和适用场景。 首先, let's 看一下这些排序算法的时间复杂度和空间复杂度: | 排序算法 | 平均情况 | 最好情况 | 最坏情况 | ...
经典排序算法 - 归并排序Merge sort 经典排序算法 - 冒泡排序Bubble sort 经典排序算法 - 选择排序Selection sort 经典排序算法 - 鸡尾酒排序Cocktail sort 经典排序算法 - 希尔排序Shell sort 经典排序算法 - ...
归并排序是一种高效的排序算法,基于分治策略。在计算机科学中,数据结构和算法是核心部分,因为它们直接影响程序的效率和性能。归并排序是排序算法中的一个重要概念,尤其在处理大量数据时,其稳定性及平均时间...
归并排序是一种经典的排序算法,基于分治策略。在计算机科学中,分治法是一种将大问题分解为小问题来解决的方法。归并排序利用这一思想,将一个大数组拆分成两个或更多个小数组,分别对这些小数组进行排序,然后将...
本主题将深入探讨四种常见的排序算法:归并排序、快速排序以及与链表相关的排序方法。 首先,我们来讨论归并排序(Merge Sort)。这是一种基于分治策略的排序算法。归并排序将大问题分解为小问题,然后逐步合并这些...
Java代码-排序-直接插入排序、希尔排序、直接选择排序、冒泡排序、堆排序、快速排序、归并排序中部分排序以及算法-贪心法,大家可以将源码下载下来进行学习,附带着注释和解释,有不理解的可以找博主一起探讨,共同...
本文将深入探讨标题和描述中提到的一些基本排序算法,包括选择排序、冒泡排序、插入排序、希尔排序、堆排序、快速排序以及归并排序,并结合C++编程语言进行讲解。 1. **选择排序(Selection Sort)** - 选择排序是一...
除此之外,还有其他一些排序算法,如归并排序,它采用分治策略,将数组分割成两半,分别排序后再合并,保证了稳定性,时间复杂度为O(N log N)。 在实际应用中,应根据数据规模、数据分布以及内存限制等因素选择合适...
本篇文章主要探讨了如何在VC++环境中利用多线程技术来实现三种经典的排序算法:冒泡排序、快速排序和归并排序,并对它们的性能进行了比较。 首先,冒泡排序是一种简单的排序算法,它重复地遍历待排序的数列,一次...
【基础算法】-C语言实现归并排序归并排序算法思路先将待排序的序列拆分成若干小规模子序列,直到每个子序列可以直接排序为止。然后对每个子序列进行排序,合并成新的有序序列。重复第二步,直到只剩下一个排序完毕的...
根据给定的文件信息,我们将深入探讨两种经典的排序算法——快速排序和归并排序,并结合Java语言实现进行详细解析。 ### 快速排序算法 快速排序是一种高效的排序算法,采用分而治之的策略,其核心思想是选择一个...
在这个"JavaScript-使用javascript开发的排序算法-sorting.zip"压缩包中,很可能是包含了各种常见的排序算法实现,比如冒泡排序、插入排序、选择排序、快速排序、归并排序以及堆排序等。 1. **冒泡排序**:冒泡排序...
总之,这个压缩包提供了一个实用的C语言实现的归并排序示例,对于理解和掌握排序算法,尤其是归并排序,是一个很好的学习资源。通过阅读和理解代码,你可以深入理解分治法的思想以及如何在C语言中实现高效排序。
此文件为数据结构中的九种排序算法,包含一些排序方法的过程,其九种排序包括:直接插入排序,折半插入排序,希尔排序,冒泡排序,快速排序,选择排序,堆排序,归并排序,基数排序!