泛型问题排序

本文关键字:排序 问题 泛型 | 更新日期: 2023-09-27 18:09:41

在一次采访中他们告诉我

写出括号内的代码来排序列表。他们说顺序,但你不知道类型是int还是decimal

他们还告诉我不要使用像.sort这样的框架方法

所以我不知道该怎么做?我得准备好下次有人问我这个问题。

可能输入:7,3,8,6,1
或:6.9、4.5、2.3、6.1、9.9

namespace InterViewPreparation1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void btnSort_Click(object sender, EventArgs e)
        {
            List<int> list= new List<int>();
            list.Add(int.Parse(i1.Text));
            list.Add(int.Parse(i2.Text));
            list.Add(int.Parse(i3.Text));
            list.Add(int.Parse(i4.Text));
            list.Add(int.Parse(i5.Text));
            Sort(list);
        }

        private void Sort<T>(List<T> list)
        {
            bool madeChanges;
            int itemCount = list.Count;
            do
            {
                madeChanges = false;
                itemCount--;
                for (int i = 0; i < itemCount; i++)
                {
                    int result = Comparer<T>.Default.Compare(list[i], list[i + 1]);
                    if (result > 0)
                    {
                        Swap(list, i, i + 1);
                        madeChanges = true;
                    }
                }
            } while (madeChanges);            
        }

        public  List<T> Swap<T>(this List<T> list,
                int firstIndex,
                int secondIndex)
        {
            T temp = list[firstIndex];
            list[firstIndex] = list[secondIndex];
            list[secondIndex] = temp;
            return list;
        }
    }
}

泛型问题排序

这取决于你在"不要使用框架方法"这条路线上走了多远。或者我们应该对原始内存使用逻辑探针?坦率地说,只使用list.Sort()是愚蠢的(这是一个糟糕的面试问题,在我看来;我会争辩说:"不,我使用的是list.Sort()——它存在并且很好地完成了这项工作")。

但是!这里的另一种方法是:

var comparer = System.Collections.Generic.Comparer<T>.Default;

现在你有了一个类型安全的比较器,它将适用于任何具有排序性的T。多次调用.Compare将其放入顺序中作为练习,任何教科书上的排序策略都可以使用comparer.Compare(x, y)

Int和Double都实现了IComparable -这意味着在执行排序时应该将每个元素转换为IComparable类型。因为你不能使用任何标准的。net排序方法,你需要自己实现一个。参考排序算法。

如果方法签名不同,会更容易:

public void sortlist<T>(List<T> list)
    where T : IComparable
{
}

冒泡排序的实现示例:

for (int pass = 1; pass < list.Count; pass++)
{
    for (int i = 0; i < list.Count; i++)
    {
        if (list[i].CompareTo(list[i + 1]) > 0)
        {
            // Swap
            T temp = list[i];
            list[i] = list[i + 1];
            list[i + 1] = temp;
        }
    }
}

或者,如果T不受IComparable的限制,那么你可以根据Marcs的建议稍微调整一下,使用Comparer<T>.Default:

Comparer<T>.Default.Compare(list[i], list[i + 1])