【前言】
之前学习了三种简单的排序算法也做了相应的总结,代码实现起来也非常容易但是这些简单排序还可以再优化一下,减少交换的次数,下面分享一下小编的优化方法。
一、选择排序
1、思想
优化前:假设第一个数是最大的为max,分别和后面的数arr[i]作比较如果arr[i]比max大的话,那么就把arr[i]和max交换,直到找出一个最大数完成第一趟的比较。
这样每次arr[i]比max大都要做一次交换。
优化后:假设第一个数是最大的为max,分别和后面的数i作比较如果i比max大的话,那么就记录arr[i]的位置i,直到找出一个最大数,这是将max和arr[1]交换。
优化后只需要在找出最大数之后交换一次就行了,减少了交换的次数。
2.对应的代码实现
#region 选择排序
for (int i = 0; i < arr.Length - 1; i++)
{
for (int j = i + 1; j < arr.Length - 1; j++)
{
if (arr[i] > arr[j])
{
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
foreach (int item in arr)
{
Console.Write(item + " ");
}
Console.WriteLine();
}
#endregion
#region 优化后的选择
for (int i = 0; i < arr.Length - 1; i++)
{
int tempwei = i;
for (int j = i + 1; j < arr.Length; j++)
{
if (arr[tempwei] > arr[j])
{
tempwei = j;
}
}
temp = arr[tempwei];
arr[tempwei] = arr[i];
arr[i] = temp;
foreach (int item in arr)
{
Console.Write(item + " ");
}
Console.WriteLine();
}
#endregion
二、插入排序
1、思想
优化前:将无序区第一个数和前面的比较,如果比前面的小就交换再和前面的比较直到比前一个数大为止结束第一趟排序。
只要比前面小就要一直交换。
优化后:将第一个待排数的位置空出来,然后后面的数再比的时候就不用交换了,可以直接放到前一个的位置并且记录当前较大数的位置,在最后的时候把临时变量的值在赋给最后一次记录的位置。
把一个位置空出来之后只要赋值就行了,不需要交换。
2.对应的代码实现
#region 插入排序
for (int i = 1; i < arr.Length; i++)
{
for (int j = i; j > 0; j--)
{
if (arr[j] < arr[j - 1])
{
temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
}
}
}
#endregion
#region 优化后的插入
for (int i = 1; i < arr.Length; i++)
{
temp = arr[i];
int tempwei = i;
for (int j = i; j > 0; j--)
{
if (temp < arr[j - 1])
{
arr[j] = arr[j - 1];
tempwei = j - 1;
}
}
arr[tempwei] = temp;
foreach (int item in arr)
{
Console.Write(item + " ");
}
Console.WriteLine();
}
#endregion
【总结】
实现了代码并不意味了这件事情的结束,我们应该想办法把它变得更加精简,处理一些简单的数据可能没有多大问题,但是一旦数据量稍微大一些,效率就指数倍的降低了。
欢迎大家一切交流!