“Sorted”是一个随机生成的,最初未排序的整数数组
private void insertion_Click(object sender, EventArgs e)
{
Stopwatch sw = new Stopwatch();
sw.Start();
for(int i = 1; i < Sorted.Length; i++)
{
int j = i;
while(j>0 && Sorted[j-1] > Sorted[j])
{
swap(Sorted, j - 1, j);
j -= 1;
}
}
sw.Stop();
IsSorted = true;
UpdateButtons(IsSorted);
MessageBox.Show($"Insertion sort took {(sw.ElapsedMilliseconds).ToString()} milliseconds", "Insertion sort");
}
//Selection sort
private void selection_Click(object sender, EventArgs e)
{
Stopwatch sw = new Stopwatch();
sw.Start();
for(int i = 0; i < Sorted.Length-1; i++)
{
int CurrMinIndex = i;
for(int j = i; j < Sorted.Length; j++)
{
if(Sorted[j] < Sorted[CurrMinIndex])
{
CurrMinIndex = j;
}
}
if(CurrMinIndex != i)
{
swap(Sorted, CurrMinIndex, i);
}
}
sw.Stop();
IsSorted = true;
UpdateButtons(IsSorted);
MessageBox.Show($"Selection sort took {(sw.ElapsedMilliseconds).ToString()} milliseconds", "Selection Sort");
}
我正在设计一个C#WPF应用程序,它对随机生成的列表进行排序,然后输出完成所花费的时间(以毫秒为单位)。我知道插入排序平均应该比选择排序更好,但我的结果告诉我。我甚至没有看到插入排序的时间接近选择排序。事实上,我的选择排序算法似乎一直快两倍!有人在这看到问题吗?我以为我已经完成了两种算法的一些非常一般的形式,但我是否意外地进行了优化?
编辑:这是我用来填充列表的算法:
Sorted = new int[ListSize]; //initialize/populate unsorted array
Random Rand = new Random();
for (int i = 0; i < ListSize; i++)
{
Sorted[i] = Rand.Next(-1000, 1000);
}
答案 0 :(得分:1)
您的插入排序实现不够好。你在寻找元素P的位置时进行完全交换,但是它足以记住P,向上移动较大的元素(半交换?),然后插入P
int j = i;
int P = Sorted[j];
while(j>0 && Sorted[j-1] > P)
{
Sorted[j] = Sorted [j-1];
j--;
};
Sorted[j] = P;