Calculate median in c#

前端 未结 12 1497
别跟我提以往
别跟我提以往 2020-11-29 23:35

I need to write function that will accept array of decimals and it will find the median.

Is there a function in the .net Math library?

12条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2020-11-30 00:04

    Here is the fastest unsafe implementation, same algorithm before, taken from this source

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        private static unsafe void SwapElements(int* p, int* q)
        {
            int temp = *p;
            *p = *q;
            *q = temp;
        }
    
        public static unsafe int Median(int[] arr, int n)
        {
            int middle, ll, hh;
    
            int low = 0; int high = n - 1; int median = (low + high) / 2;
            fixed (int* arrptr = arr)
            {
                for (;;)
                {
                    if (high <= low)
                        return arr[median];
    
                    if (high == low + 1)
                    {
                        if (arr[low] > arr[high])
                            SwapElements(arrptr + low, arrptr + high);
                        return arr[median];
                    }
    
                    middle = (low + high) / 2;
                    if (arr[middle] > arr[high])
                        SwapElements(arrptr + middle, arrptr + high);
    
                    if (arr[low] > arr[high])
                        SwapElements(arrptr + low, arrptr + high);
    
                    if (arr[middle] > arr[low])
                        SwapElements(arrptr + middle, arrptr + low);
    
                    SwapElements(arrptr + middle, arrptr + low + 1);
    
                    ll = low + 1;
                    hh = high;
                    for (;;)
                    {
                        do ll++; while (arr[low] > arr[ll]);
                        do hh--; while (arr[hh] > arr[low]);
    
                        if (hh < ll)
                            break;
    
                        SwapElements(arrptr + ll, arrptr + hh);
                    }
    
                    SwapElements(arrptr + low, arrptr + hh);
    
                    if (hh <= median)
                        low = ll;
                    if (hh >= median)
                        high = hh - 1;
                }
            }
        }
    

提交回复
热议问题