归并排序:
归并排序的代码:
//归并排序
void __MergeSort(int array[], int left, int right, int* extra) {
if (right == left + 1) {
//剩余一个数,有序
return;
}
if (left >= right) {
//区间没有数
return;
}
int mid = left + (right - left) / 2;
//区间分成左右两个小区间
//[left,mid)
//[mid,right)
//先把两个小区间进行排序,分治算法,递归解决
__MergeSort(array, left, mid, extra);
__MergeSort(array, mid, right, extra);
//左右小区间已经有序
//合并有序数组
Merge(array, left, mid, right, extra);
}
合并数组的函数代码:
//合并有序数组
//array[left,mid)
//array[mid,right)
//时间复杂度 O(n)
//空间复杂度 O(n)
void Merge(int array[], int left, int mid, int right, int* extra) {
//需要一个额外的空间去实现
int size = right - left;
int* extra = (int*)malloc(sizeof(int)* size);
int left_index = left;
int right_index = mid;
int extra_index = 0;
while (left_index < mid&&right_index < right) {
if (array[left_index] <= array[right_index]) {
extra[extra_index] = array[left_index];
left_index++;
}
else {
extra[extra_index] = array[right_index];
right_index++;
}
extra_index++;
}
//将左边元素填充
while (left_index < mid) {
extra[extra_index++] = array[left_index];
}
//将右边元素填充
while (right_index < mid) {
extra[extra_index++] = array[right_index];
}
for (int i = 0; i < size; i++) {
array[left + i] = extra_index[i];
}
free(extra);
}
合并代码这块不太理解的可以参考这个示例,按照代码一步步尝试: