MatrixBerryCore
mergesort.m
Go to the documentation of this file.
1 function [x,indVec] = mergesort(x)
2 
3 % Knobs
4 kk = 15; % Insertion sort threshold, k >= 1
5 
6 % Mergesort
7 n = length(x);
8 [x,indVec] = mergesorti(x,1,n,kk);
9 
10 end
11 
12 function [x,indVec] = mergesorti(x,ll,uu,kk)
13 indVec=1:numel(x);
14 if iscolumn(x)
15  indVec=indVec.';
16 end
17 %
18 % Compute center index
19 mm = floor((ll + uu) / 2);
20 
21 % Divide...
22 if ((mm + 1 - ll) <= kk)
23  % Sort x(ll:mm) via insertion sort
24  x = insertionsorti(x,ll,mm);
25 else
26  % Sort x(ll:mm) via insertion sort
27  x = mergesorti(x,ll,mm,kk);
28 end
29 if ((uu - mm) <= kk)
30  % Sort x((mm + 1):uu) via insertion sort
31  x = insertionsorti(x,mm + 1,uu);
32 else
33  % Sort x((mm + 1):uu) via merge sort
34  x = mergesorti(x,mm + 1,uu,kk);
35 end
36 
37 % ... and conquer
38 % Combine sorted arrays x(ll:mm) and x((mm + 1):uu)
39 x = merge(x,ll,mm,uu);
40 
41 
42  function x = insertionsorti(x,ll,uu)
43 
44  for j = (ll + 1):uu
45  pivot = x(j);
46  pivotInd=indVec(j);
47  i = j;
48  while ((i > ll) && (x(i - 1) > pivot))
49  x(i) = x(i - 1);
50  indVec(i)=indVec(i-1);
51  i = i - 1;
52  end
53  x(i) = pivot;
54  indVec(i)=pivotInd;
55  end
56 
57  end
58 
59  function x = merge(x,ll,mm,uu)
60 
61  % Note: In practice, use memcpy() or similar
62  L = x(ll:mm);
63  indLVec=indVec(ll:mm);
64 
65  % Combine sorted arrays
66  i = 1;
67  j = mm + 1;
68  k = ll;
69  while ((k < j) && (j <= uu))
70  if (L(i) <= x(j))
71  x(k) = L(i);
72  indVec(k)=indLVec(i);
73  i = i + 1;
74  else
75  x(k) = x(j);
76  indVec(k)=indVec(j);
77  j = j + 1;
78  end
79  k = k + 1;
80  end
81 
82  % Note: In practice, use memcpy() or similar
83  x(k:(j - 1)) = L(i:(i + j - k - 1));
84  indVec(k:(j - 1)) = indLVec(i:(i + j - k - 1));
85 
86  end
87 end
function mergesort(in x)
Syntax: sx = mergesort(x);.
function mergesorti(in x, in ll, in uu, in kk)
Sort x(ll:uu) via merge sort Note: In practice, x xhould be passed by reference.