C语言实现归并排序
/*
* 归并排序 (核心思想:分、治)
*
* 原理:
*
* 将每个数据看成一组 将数据进行两两分组
*
* 对每个分组进行排序
*
* 将分组后的小组两两分组 再次进行排序(逐个位置比较)
*
*/
void merge(int arr[], int tempArr[], int left, int mid, int right)
{
int l_cnt = left;
int r_cnt = mid + 1;
int cnt = left;
while (l_cnt <= mid && r_cnt <= right)
{
if (arr[l_cnt] < arr[r_cnt])
tempArr[cnt++] = arr[l_cnt++];
else
tempArr[cnt++] = arr[r_cnt++];
}
while (l_cnt <= mid)
{
tempArr[cnt++] = arr[l_cnt++];
}
while (r_cnt <= right)
{
tempArr[cnt++] = arr[r_cnt++];
}
while (left <= right)
{
arr[left] = tempArr[left];
left++;
}
}
void m_sort(int arr[], int tempArr[], int left, int right)
{
if (left < right)
{
int mid = (left + right) / 2;
m_sort(arr, tempArr, left, mid);
m_sort(arr, tempArr, mid + 1, right);
merge(arr, tempArr, left, mid, right);
}
}
void merge_sort(int arr[],int len)
{
int* tempArr = (int*)malloc(len * sizeof(int));
if (tempArr)
{
m_sort(arr, tempArr, 0, len - 1);
free(tempArr);
printf("\n归并排序输出:\n");
int i;
for (i = 0; i < len; i++)
printf("%d ", arr[i]);
}
else printf("分配内存失败");
}
int main()
{
int len = (int)sizeof(arr) / sizeof(*arr);
int arr4[] = { 45,3,6354,45,34,6,432,5745,3423,3423 };
merge_sort(arr4, len);
}