合并排序法 (Merge Sorting) 是外部排序最常使用的排序方法。
主要应用场景是:若数据量太大无法一次完全加载内存,
可使用外部辅助内存来处理排序数据,主要应用在文件排序。
排序方法:
将欲排序的数据分别存在数个文件大小可加载内存的文件中,
再针对各个文件分别使用“内部排序法” 将文件中的数据排序好写回文件。
再对所有已排序好的文件两两合并, 直到所有文件合并成一个文件后,
则数据排序完成。
合并排序是使用到了分治方法(Divide and Conquer)。
Divide:将原问题分解为若干子问题,其中这些子问题的规模小于原问题的规模。
Conquer:递归地求解子问题,当子问题规模足够小时直接求解。
Merge:将子问题的解合并得到原问题的解。
下面是代码实现部分:
class Merge{
public void merge_sort(int arr[], int start, int end)
{
//当数组长度大于0时,继续进行分割
if(start < end)
{
//每次分割都是找到中间位置,作为分割点
int m = (start + end) / 2;
//分割的前半段,继续进行分割
merge_sort(arr, start, m);
//分割的后半段,也继续进行分割。都进行分割的前提是,长度大于0,且还能分割
merge_sort(arr, m+1, end);
//分割完成后,进行合并
combine_arrays(arr, start, m, end);
}
}
public void combine_arrays(int arr[], int start, int m, int end)
{
int length = end - start + 1;
int temp[] = new int[length];
int i = start;
int j = m+1;
int c = 0;
//把两段数组中比较,较小的那个放到temp中
while(i<=m && j<=end)
{
if(arr[i] < arr[j])
{
temp[c] = arr[i];
i++;
c++;
}
else
{
temp[c] = arr[j];
j++;
c++;
}
}
//当前面比较结束,前半段剩下的部分
while(i <= m)
{
temp[c] = arr[i];
i++;
c++;
}
//当后半段比较结束,后半段剩下的部分
while(j <= end)
{
temp[c] = arr[j];
j++;
c++;
}
//合并成一个数组
c = 0;
for(int t = start; t <= end; t++,c++)
{
arr[t] = temp[c]; //把排序好了的数组,放到原来的数组中
}
}
}
然后是调用部分:
int arr[] = {-9, -50, 100, 20, 35, 7, 1, 56};
Merge ms = new Merge();
ms.merge_sort(arr, 0, arr.length-1);
for(int i = 0; i < arr.length; i++)
{
System.out.println("arr[" + i + "] = " + arr[i]);
}
结果如下:
合并排序一般是处理内存一次放不下这么大数据的时候,采用分而治之的思路来做。
来源:https://blog.csdn.net/shao15232/article/details/102737667