[FFmpeg-cvslog] libavutil: add a merge sort.
Michael Niedermayer
git at videolan.org
Mon Jun 18 19:07:27 CEST 2012
ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Mon Jun 18 18:40:02 2012 +0200| [f87dacb27de93f995cb18f9dcc73581ef8fc157b] | committer: Michael Niedermayer
libavutil: add a merge sort.
compared to qsort this is slower but its stable and doesnt have a O(n^2) worst
case
Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=f87dacb27de93f995cb18f9dcc73581ef8fc157b
---
libavutil/qsort.h | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/libavutil/qsort.h b/libavutil/qsort.h
index a9ab1f3..089eb74 100644
--- a/libavutil/qsort.h
+++ b/libavutil/qsort.h
@@ -90,3 +90,28 @@
}\
}\
}
+
+/**
+ * Merge sort, this sort requires a temporary buffer and is stable, its worst
+ * case time is O(n log n)
+ * @param p must be a lvalue pointer, this function may exchange it with tmp
+ * @param tmp must be a lvalue pointer, this function may exchange it with p
+ */
+#define AV_MSORT(p, tmp, num, type, cmp) {\
+ unsigned i, j, step;\
+ for(step=1; step<(num); step+=step){\
+ for(i=0; i<(num); i+=2*step){\
+ unsigned a[2] = {i, i+step};\
+ unsigned end = FFMIN(i+2*step, (num));\
+ for(j=i; a[0]<i+step && a[1]<end; j++){\
+ int idx= cmp(p+a[0], p+a[1]) < 0;\
+ tmp[j] = p[ a[idx]++ ];\
+ }\
+ if(a[0]>=i+step) a[0] = a[1];\
+ for(; j<end; j++){\
+ tmp[j] = p[ a[0]++ ];\
+ }\
+ }\
+ FFSWAP(type*, p, tmp);\
+ }\
+}
More information about the ffmpeg-cvslog
mailing list