和归并排序一样,k路稍微复杂一点,用一个最小堆(tmp)维护每个有序数组(result)剩余第一个元素的最小值,添加到结果数组中,由于堆是对指针进行操作,因此没取出一个数,将其指针指向下一个元素即可(为了判断一个数组的元素是否取完,在每个数组后面添加了一个最大值32767),代码如下:
/* * sort.c * * Created on: Feb 13, 2016 * Author: wing */ #include<stdio.h> #include<stdlib.h> struct line{ int l; int r; }; int exchange(struct line *x,int i,int j) { struct line tmp; tmp=x[i]; x[i]=x[j]; x[j]=tmp; return 0; } int sort(struct line *x,int l,int r) { int i=l-1,j,k=l-1; if (r<=l) return 0; for (j=l;j<=r-1;j++) if (x[j].r<x[r].l) { exchange(x,k+1,i+1); exchange(x,k+1,j); i++; k++; } else if (x[j].l<=x[r].r) { exchange(x,i+1,j); i++; } exchange(x, i + 1, r); i++; sort(x,l,k); sort(x,i+1,r); return 0; } int main(void) { int n,i; struct line *x; scanf("%d",&n); x=(struct line *)malloc(sizeof(struct line)*n); for (i=0;i<n;i++) { scanf("%d",&x[i].l); scanf("%d",&x[i].r); } sort(x,0,n-1); for (i=0;i<n;i++) printf("(%d,%d) ",x[i].l,x[i].r); return 0; }