Advertisement
Guest User

Untitled

a guest
Oct 18th, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.43 KB | None | 0 0
  1. /* From ffmpeg livautil/qsort.h */
  2. #define FFSWAP(type,a,b) do{type SWAP_tmp= b; b= a; a= SWAP_tmp;}while(0)
  3. #define AV_QSORT(p, num, type, cmp) do {\
  4. void *stack[64][2];\
  5. int sp= 1;\
  6. stack[0][0] = p;\
  7. stack[0][1] = (p)+(num)-1;\
  8. while(sp){\
  9. type *start= stack[--sp][0];\
  10. type *end = stack[ sp][1];\
  11. while(start < end){\
  12. if(start < end-1) {\
  13. int checksort=0;\
  14. type *right = end-2;\
  15. type *left = start+1;\
  16. type *mid = start + ((end-start)>>1);\
  17. if(cmp(start, end) > 0) {\
  18. if(cmp( end, mid) > 0) FFSWAP(type, *start, *mid);\
  19. else FFSWAP(type, *start, *end);\
  20. }else{\
  21. if(cmp(start, mid) > 0) FFSWAP(type, *start, *mid);\
  22. else checksort= 1;\
  23. }\
  24. if(cmp(mid, end) > 0){ \
  25. FFSWAP(type, *mid, *end);\
  26. checksort=0;\
  27. }\
  28. if(start == end-2) break;\
  29. FFSWAP(type, end[-1], *mid);\
  30. while(left <= right){\
  31. while(left<=right && cmp(left, end-1) < 0)\
  32. left++;\
  33. while(left<=right && cmp(right, end-1) > 0)\
  34. right--;\
  35. if(left <= right){\
  36. FFSWAP(type, *left, *right);\
  37. left++;\
  38. right--;\
  39. }\
  40. }\
  41. FFSWAP(type, end[-1], *left);\
  42. if(checksort && (mid == left-1 || mid == left)){\
  43. mid= start;\
  44. while(mid<end && cmp(mid, mid+1) <= 0)\
  45. mid++;\
  46. if(mid==end)\
  47. break;\
  48. }\
  49. if(end-left < left-start){\
  50. stack[sp ][0]= start;\
  51. stack[sp++][1]= right;\
  52. start = left+1;\
  53. }else{\
  54. stack[sp ][0]= left+1;\
  55. stack[sp++][1]= end;\
  56. end = right;\
  57. }\
  58. }else{\
  59. if(cmp(start, end) > 0)\
  60. FFSWAP(type, *start, *end);\
  61. break;\
  62. }\
  63. }\
  64. }\
  65. } while (0)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement