一、归并排序
1、基本思想:
(1)分:使用二分法将n个记录看成是n个有序的子序列,每个子序列的长度为1。
(2)合:两两归并,直到得到一个长度为n的有序序列为止。
2、核心操作:将一维数组中前后相邻的两个有序序列归并为一个有序序列。
3、代码如下:
#include<stdio.h>
void Merge(int arr[], int tmp[], int startIndex, int midIndex, int endIndex)
{
int i = startIndex;
int j = midIndex + 1;
int k = startIndex; //新数组的下标
while (i != midIndex + 1 && j != endIndex + 1) //左右都没越界
{
if (arr[i] > arr[j])
{
tmp[k++] = arr[j++];
}
else
{
tmp[k++] = arr[i++];
}
}
while (i != midIndex + 1)
{
tmp[k++] = arr[i++];
}
while (j != endIndex + 1)
{
tmp[k++] = arr[j++];
}
for (int i = startIndex; i <= endIndex; ++i)
{
arr[i] = tmp[i];
}
}
void MergeSort(int arr[], int tmp[], int startIndex, int endIndex)//数据所在数组、临时数组、开始下标、结束下标
{
if (startIndex < endIndex) //递归条件
{
int midIndex = (startIndex + endIndex) / 2;
MergeSort(arr, tmp, startIndex, midIndex); //左半边再分
MergeSort(arr, tmp, midIndex + 1, endIndex); //右半边再分
Merge(arr, tmp, startIndex, midIndex, endIndex); //归并
}
}
#define N 12
int main()
{
int arr[12] = { 45, 5, 4, 12, 4, 156, 456, 465, 4, 12, 16, 6 };
int len = sizeof(arr) / sizeof(arr[0]);
int tmp[N];
MergeSort(arr, tmp, 0, len - 1);
return 0;
}