归并排序就是将一个数组分为两个数组,再将两个有序数组合成为一个数组。
#include<stdio.h>
#include<stdlib.h>
void Merge(int arr[], int left,int mid, int right, int *extra){
int size = right - left;//传进来的数组大小
int extra_index = 0;
int left_index = left;
int right_index = mid;
while (left_index < mid&&right_index< right){//左边的数组它的左下标小于它的右下标与右边数组的左下表小于它的右下标
if (arr[left_index] <= arr[right_index]){//左边数组的左值小于右边数组的左值
extra[extra_index] = arr[left_index];
left_index++;
}
else{
extra[extra_index] = arr[right_index];
right_index++;
}
extra_index++;
}
while (left_index < mid){//右边数组的值都赋给了extra
extra[extra_index] = arr[left_index];
left_index++;
extra_index++;
}
while (right_index < right){//左边数组的值都赋给了extra
extra[extra_index] = arr[right_index];
right_index++;
extra_index++;
}
for (int i = 0; i < size; i++){//将extra的值赋给arr
arr[left+i] = extra[i];
}
}
void _MergeSort(int arr[], int left, int right, int *extra){
if (left + 1 == right){//数组中只有一个数
return;
}
if (left >= right){//数组中没有数
return;
}
int mid = left + (right - left) / 2;
_MergeSort(arr, left, mid, extra);
_MergeSort(arr, mid, right, extra);
Merge(arr, left, mid, right, extra);//合并两个有序数组
}
int main(){
int arr[] = { 5, 7, 3, 6, 1, 4, 7, 2, 8 };
int size = sizeof(arr) / sizeof(int);
int *extra = (int *)malloc(sizeof(int)*size);
memset(extra, "0", sizeof(arr));
_MergeSort(arr, 0, size, extra);
for (int i = 0; i < size; i++){
printf("%d ", arr[i]);
}
free(extra);
system("pause");
return 0;
}