合并排序的主要功能是将两个已经排好序的数组合并成一个有序的大数组。合并的算法思想为:每次取两个数组中最小的(或者最大的)加入到新数组中。
合并排序算法的C++递归代码:
void merge_sort(int array_data[], int array_start_index, int array_end_index)
{
if( array_start_index < array_end_index )
{
int q = ( array_start_index + array_end_index ) / 2;
merge_sort(array_data, array_start_index , q);
merge_sort(array_data, q+1, array_end_index );
merge_two_subarray(array_data, array_start_index , q, array_end_index );
}
}
void merge_two_subarray(int array_data[], int array1_start_index, int array1_end_index, int array2_end_index)
{
int array1Len = array1_end_index - array1_start_index + 1;
int array2Len = array2_end_index - array1_end_index;
int *array1Data = new int[array1Len];
int *array2Data = new int[array2Len];
int *pa1;
int *pa2;
pa1 = array1Data;
pa2 = array2Data;
int i = 0;
int j = 0;
for(i = 0; i < array1Len; i++)
*pa1++ = array_data[array1_start_index + i];
for(j = 0; j < array2Len; j++)
*pa2++ = array_data[array1_end_index + 1 + j];
i = 0;
j = 0;
for(int k = array1_start_index; k <= array2_end_index; k++)
{
if((i < array1Len) && (j <array2Len))
{
if(array1Data[i] < array2Data[j])
array_data[k] = array1Data[i++];
else
array_data[k] = array2Data[j++];
}
else if(i < array1Len)
array_data[k] = array1Data[i++];
else
array_data[k] = array2Data[j++];
}
delete []array1Data;
delete []array2Data;
}
合并排序递归算法中将一个问题分成两个更小的子问题的思想值得细细体会与不断玩味,大部分复杂的问题都可以借助这种方法
去解决。