MZFormSheetPresentationController高级自定义:创建完全个性化的弹窗系统
2026/6/13 16:19:13
功能:把两个有序子数组 a[low…mid] 和 a[mid+1…high] 原地归并到临时数组 tmp,最后再拷回去。
关键点
#include<stdio.h>#include<stdlib.h>#include<string.h>/* 合并两个有序区间 a[low..mid] 与 a[mid+1..high] */staticvoidmerge(int*a,intlow,intmid,inthigh){inti=low,j=mid+1,k=0;int*tmp=malloc((high-low+1)*sizeof(int));if(!tmp){perror("malloc");exit(EXIT_FAILURE);}/* 二路归并 */while(i<=mid&&j<=high)tmp[k++]=(a[i]<=a[j])?a[i++]:a[j++];while(i<=mid)tmp[k++]=a[i++];while(j<=high)tmp[k++]=a[j++];/* 拷回原数组 */memcpy(a+low,tmp,(high-low+1)*sizeof(int));free(tmp);}/* 归并排序递归主体 */staticvoidmerge_sort(int*a,intlow,inthigh){if(low<high){intmid=low+(high-low)/2;/* 防溢出 */merge_sort(a,low,mid);merge_sort(a,mid+1,high);merge(a,low,mid,high);}}/* 对外接口:排序长度为 n 的整型数组 */voidmerge_sort_int(int*a,size_tn){if(n>1)merge_sort(a,0,(int)n-1);}/* ---- 测试 ---- */intmain(void){intarr[]={8,3,6,7,1,5,2,4};size_tn=sizeof(arr)/sizeof(arr[0]);merge_sort_int(arr,n);for(size_ti=0;i<n;++i)printf("%d%c",arr[i],i+1==n?'\n':' ');return0;}链表归并排序
链表无法随机拆分,用快慢指针找中点,然后递归归并,空间可做到 O(log n)(递归栈)。
外排序
文件太大内存放不下,先分段生成有序临时文件,再做多路归并。
逆序对
在 merge 过程中,若左边元素 > 右边元素,则左边剩余元素都与该右边元素构成逆序对,可顺手统计。
原地归并
经典算法有 “旋转法” 或 “缓冲法”,但实现复杂且常数大,实际工程里仍用辅助数组。