How do I calculate the “median of five” in C#?

后端 未结 10 2039
遇见更好的自我
遇见更好的自我 2020-12-04 22:05

The median of five is sometimes used as an exercise in algorithm design and is known to be computable using only 6 comparisons.

What is the best way

相关标签:
10条回答
  • 2020-12-04 23:06

    Just to check how many comparisons:

        class MyComparable : IComparable
    {
    
        public static int NumberOfComparisons = 0;
    
        public int NumPart { get; set; }
    
        #region IComparable Members
    
        public int CompareTo(object obj)
        {
            NumberOfComparisons++; //I know, not thread safe but just for the sample
            MyComparable mc = obj as MyComparable;
            if (mc == null)
                return -1;
            else
                return NumPart.CompareTo(mc.NumPart);
        }
    
        #endregion
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            List<MyComparable> list = new List<MyComparable>();
            list.Add(new MyComparable() { NumPart = 5 });
            list.Add(new MyComparable() { NumPart = 4 });
            list.Add(new MyComparable() { NumPart = 3 });
            list.Add(new MyComparable() { NumPart = 2 });
            list.Add(new MyComparable() { NumPart = 1 });
            list.Sort();
    
    
            Console.WriteLine(MyComparable.NumberOfComparisons);
        }
    }
    

    the result is 13.

    0 讨论(0)
  • 2020-12-04 23:06

    This should do it

    private Double medianofFive(double[] input)
    {
        Double temp;
    if (input[0] > input[1])//#1 - sort First and Second
    {
        temp = input[0];
        input[0] = input[1];
        input[1] = temp;
    }
    if (input[2] > input[3])//#2 sort Third and Fourth
    {
        temp = input[2];
        input[2] = input[3];
        input[3] = temp;
    }
    
    // replace the smaller of first and third with 5th, then sort
    int smallerIndex = input[0] < input[2] ? 0 : 2;//#3
    input[smallerIndex] = input[4];
    
    //sort the new pair
    if(input[smallerIndex]>input[smallerIndex+1])//#4
    {
        temp = input[smallerIndex];
        input[smallerIndex] = input[smallerIndex+1];
        input[smallerIndex+1] = temp;
    }
    
    //compare the two smaller numbers
    // then compare the smaller of the two's partner with larger of the two
    // the smaller of THOSE two is the median
    if (input[2] > input[0])
    //#5
    {
        temp = input[2] > input[1] ? input[1] : input[2];//#6
    }
    else
    {
        temp = input[0] > input[3] ? input[3] : input[0];//#6
    }
        return temp;
    }
    
    0 讨论(0)
  • 2020-12-04 23:06

    Interesting how many comparisons in MSDN sample...

    public static double Median(this IEnumerable<double> source) {
            if (source.Count() == 0)  throw new InvalidOperationException("Cannot compute median for an empty set.");
    
            var sortedList = from number in source
                             orderby number
                             select number;
    
            int itemIndex = (int)sortedList.Count() / 2;
    
            if (sortedList.Count() % 2 == 0) {
                // Even number of items.
                return (sortedList.ElementAt(itemIndex) + sortedList.ElementAt(itemIndex - 1)) / 2; } else {
                // Odd number of items.
                return sortedList.ElementAt(itemIndex); }
        }
    
    0 讨论(0)
  • 2020-12-04 23:10

    This is basically just factoring out the swapping and sorting code from your C++ example:

    private static void Swap(ref double a, ref double b) {
        double t = a;
        a = b;
        b = t;
    }
    
    private static void Sort(ref double a, ref double b) {
        if (a > b) {
            double t = a;
            a = b;
            b = t;
        }
    }
    
    private static double MedianOfFive(double a, double b, double c, double d, double e){
        // makes a < b and c < d
        Sort(ref a, ref b);
        Sort(ref c, ref d);
    
        // eleminate the lowest
        if (c < a) {
            Swap(ref b, ref d);
            c = a;
        }
    
        // gets e in
        a = e;
    
        // makes a < b
        Sort(ref a, ref b);
    
        // eliminate another lowest
        // remaing: a,b,d
        if (a < c) {
            Swap(ref b, ref d);
            a = c;
        }
    
        return Math.Min(d, a);
    }
    
    0 讨论(0)
提交回复
热议问题