146 {
148 ref T j = ref
Unsafe.Add(ref reference,
keys.Length - 1);
149 ref T reference2 = ref
Unsafe.Add(ref reference,
keys.Length - 1 >> 1);
153 ref T reference3 = ref
Unsafe.Add(ref reference,
keys.Length - 2);
154 T left = reference2;
155 Swap(ref reference2, ref reference3);
156 ref T reference4 = ref reference;
157 ref T reference5 = ref reference3;
158 while (
Unsafe.IsAddressLessThan(ref reference4, ref reference5))
159 {
160 if (left == null)
161 {
162 while (
Unsafe.IsAddressLessThan(ref reference4, ref reference3))
163 {
164 ref T reference6 = ref
Unsafe.Add(ref reference4, 1);
165 reference4 = ref reference6;
166 if (reference6 != null)
167 {
168 break;
169 }
170 }
171 while (
Unsafe.IsAddressGreaterThan(ref reference5, ref reference))
172 {
173 ref T reference7 = ref
Unsafe.Add(ref reference5, -1);
174 reference5 = ref reference7;
175 if (reference7 == null)
176 {
177 break;
178 }
179 }
180 }
181 else
182 {
183 while (
Unsafe.IsAddressLessThan(ref reference4, ref reference3))
184 {
185 ref T reference8 = ref
Unsafe.Add(ref reference4, 1);
186 reference4 = ref reference8;
188 {
189 break;
190 }
191 }
192 while (
Unsafe.IsAddressGreaterThan(ref reference5, ref reference))
193 {
194 ref T reference9 = ref
Unsafe.Add(ref reference5, -1);
195 reference5 = ref reference9;
196 if (!
LessThan(ref left, ref reference9))
197 {
198 break;
199 }
200 }
201 }
202 if (!
Unsafe.IsAddressLessThan(ref reference4, ref reference5))
203 {
204 break;
205 }
206 Swap(ref reference4, ref reference5);
207 }
208 if (!
Unsafe.AreSame(ref reference4, ref reference3))
209 {
210 Swap(ref reference4, ref reference3);
211 }
212 return (
int)((nint)
Unsafe.ByteOffset(ref reference, ref reference4) /
Unsafe.SizeOf<T>());
213 }
static void SwapIfGreater(ref T i, ref T j)
static bool GreaterThan(ref T left, ref T right)
static bool LessThan(ref T left, ref T right)
static void Swap(ref T i, ref T j)