在接受采访时他们告诉我
将代码写在括号中以订购列表。他们说订单,但你不知道类型是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;
}
}
}
答案 0 :(得分:6)
这取决于你去“不使用框架方法”的路线。或者我们应该使用逻辑探针来对抗原始内存?坦率地说,不只使用list.Sort()
是愚蠢的(这是一个糟糕的面试问题,IMO;我认为“不,我正在使用list.Sort()
- 它存在并且确实存在很好地工作“)。
但是!这里的另一种方法是获得:
var comparer = System.Collections.Generic.Comparer<T>.Default;
现在你有一个类型安全的比较器,适用于任何具有可排序性的T
。将.Compare
多次调用以按顺序排列的行为留作练习,任何文本书排序策略都可以使用comparer.Compare(x, y)
。
答案 1 :(得分:4)
好吧,Int和Double都会实现IComparable - 这意味着您应该在执行排序时将每个元素转换为IComparable。由于您不能使用任何标准的.Net排序方法,您需要自己实现。请参阅Sorting algorithm获取一些灵感。
如果方法签名不同,会更容易:
public void sortlist<T>(List<T> list)
where T : IComparable
{
}
bubble sort的示例实现:
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
,那么您可以使用Comparer<T>.Default
按照Marcs的建议稍微调整一下:
Comparer<T>.Default.Compare(list[i], list[i + 1])