《算法三》(归并排序)
分治思想:分而治之
归并排序:递归的拆分+合并
合并:两个有序数组合并为一个有序数组
1.准备临时数组
2.将数据元素依序放到临时数组中
3.将数据元素从临时数组拷贝回到原数组中,释放临时数组
代码演示:
#include<iostream>
#include<vector>
#include<string.h>
#define NUM 10
void print_art(int* a, int len){
for(int i=0; i<len; i++){
printf("%d ", a[i]);
}
printf("\n");
}
//合并函数
//有序数组1:L~M 有序数组2:M+1~R
void merge_sort(int* a, int L, int M, int R){
//合并函数三步走:
//1.准备临时数组
//2.将数据元素依序放到临时数组中
//3.将数据元素从临时数组拷贝回到原数组中,释放临时数组
int len = R - L + 1;//临时数组大小
int* temp = new int[len];//临时数组
int k = 0;//临时数组下标
int left = L;//数组1起始位置下标
int right = M+1;//数组2起始位置下标
while(left<=M && right<=R){
if(a[left] < a[right]){
temp[k++] = a[left++];
}else{
temp[k++] = a[right++];
}
}
while(left<=M){//如果数组1还有剩余
temp[k++] = a[left++];
}
while(right<=R){//如果数组2还有剩余
temp[k++] = a[right++];
}
//重点:memcpy时候应该放a+L位置
memcpy(a+L, temp, sizeof(int)*len);
delete[] temp;
temp = NULL;
}
//归并排序
void mergesort(int* a, int L, int R){
if( L==R ) return ;
int m = L + (R - L ) / 2;
mergesort(a, L, m);//拆分左边
mergesort(a, m+1, R);//拆分右边
merge_sort(a, L, m, R);//左右两边合并
}
int main(){
int a[NUM] = {1, 3, 5, 7, 9, 0, 2, 4, 6, 8};
mergesort(a, 0, 9);
merge_sort(a, 0, 4, 9);
print_art(a, NUM);
return 0;
}
代码重点:memcpy时候应该放a+L位置
memcpy(a+L, temp, sizeof(int)*len);
memcpy函数:
void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字符到存储区 str1

浙公网安备 33010602011771号