直观感受请点击视频观看:
归并排序:
是创建在归并操作上的一种有效的排序算法。算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。归并排序思路简单,速度仅次于快速排序,为稳定外部排序算法,一般用于对总体无序,但是各子项相对有序的数列。
基本思想:采取分治,归并的思想,主要采取三个步骤:
1:分解:将序列中待排序数列分为若干个组
2:将若干个组合并,每次比较左右数列头部谁更小(更大),移动进新数列,再比较两组数据的头部,保证数列有序(重点)
3:重复第2步操作,直到只剩下一组数列,排序完成
分解如下图:
代码参考:
void merge_sort(int *num,int l,int r){
if(r - l <= 1){
if(r - l == 1 && num[r] < num[l]) {
swap(num[r],num[l]);
}
return ;
}
int mid = (l + r) >> 1;
merge_sort(num, l ,mid);
merge_sort(num, mid + 1, r);
int *temp = (int *)malloc(sizeof(int)*(r - l + 1));
int p1 = l,p2 = mid + 1,k = 0;
while(p1 <= mid ||p2 <= r){
if(p2 > r||(p1 <= mid && num[p1] <= num[p2])){
temp[k++] = num[p1++];
} else {
temp[k++] = num[p2++];
}
}
memcpy(num + l,temp,sizeof(int) * (r - l + 1));
free(temp);
return ;
}