Advertisement
Guest User

Untitled

a guest
Apr 25th, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.91 KB | None | 0 0
  1. template <class Item>
  2. void Hybrid_Introspective_Sort (Item *Array, long N)
  3. {
  4.   IntroSort(Array,N,(int)floor(2*log(N)/M_LN2));
  5.   Insertion_Sort(Array,N);
  6. }
  7.  
  8. template <class Item>
  9. void IntroSort (Item *Array, long N, int M)
  10. {
  11.   long i;
  12.   if (M<=0)
  13.   {
  14.     Heap_Sort(Array,N);
  15.     return;
  16.   }
  17.   i=Partition(Array,0,N);
  18.   if (i>9)
  19.     IntroSort(Array,i,M-1);
  20.   if (N-1-i>9)
  21.     IntroSort(Array+i+1,N-1-i,M-1);
  22. }
  23.  
  24. template <class Item>
  25. long Partition (Item *Array, long L, long R)
  26. {
  27.   long i, j;
  28.   if (R>=3)
  29.     MedianOfThree(Array,L,R);
  30.   for (i=L, j=R-2; ; )
  31.   {
  32.     for ( ; Array[i]<Array[R-1]; ++i);
  33.     for ( ; j>=L && Array[j]>Array[R-1]; --j);
  34.     if (i<j)
  35.       Exchange(Array,i++,j--);
  36.     else break;
  37.   }
  38.   Exchange(Array,i,R-1);
  39.   return i;
  40. }
  41.  
  42. template <class Item>
  43. void MedianOfThree (Item *Array, long &L, long &R)
  44. {
  45.   if (Array[++L-1]>Array[--R])
  46.     Exchange(Array,L-1,R);
  47.   if (Array[L-1]>Array[R/2])
  48.     Exchange(Array,L-1,R/2);
  49.   if (Array[R/2]>Array[R])
  50.     Exchange(Array,R/2,R);
  51.   Exchange(Array,R/2,R-1);
  52. }
  53.  
  54. template <class Item>
  55. void Exchange (Item *Array, long i, long j)
  56. {
  57.   Item temp;
  58.   temp=Array[i];
  59.   Array[i]=Array[j];
  60.   Array[j]=temp;
  61. }
  62.  
  63. template <class Item>
  64. void Heap_Sort (Item *Array, long N)
  65. {
  66.   long i;
  67.   for (i=N/2; i>0; --i)
  68.     Heapify(Array-1,i,N);
  69.   for (i=N-1; i>0; --i)
  70.   {
  71.     Exchange(Array,0,i);
  72.     Heapify(Array-1,1,i);
  73.   }
  74. }
  75.  
  76. template <class Item>
  77. void Heapify (Item *Array, long i, long N)
  78. {
  79.   long j;
  80.   while (i<=N/2)
  81.   {
  82.     j=2*i;
  83.     if (j+1<=N && Array[j+1]>Array[j])
  84.       j=j+1;
  85.     if (Array[i]<Array[j])
  86.       Exchange(Array,i,j);
  87.     else break;
  88.     i=j;
  89.   }
  90. }
  91. template <class Item>
  92. void Insertion_Sort (Item *Array, long N)
  93. {
  94.   long i, j;
  95.   Item temp;
  96.   for (i=1; i<N; ++i)
  97.   {
  98.     temp=Array[i];
  99.     for (j=i; j>0 && temp<Array[j-1]; --j)
  100.       Array[j]=Array[j-1];
  101.     Array[j]=temp;
  102.   }
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement