您的位置:首页 > 其它

【算法初级】排序--“冒泡”和“选择”对比

2016-10-26 20:19 225 查看
       今天下午在公司比较清闲(不容易啊),对比了下排序算法中的“冒泡排序”和“选择排序”,代码如下:

using System.Threading.Tasks;

namespace Bubble_Sort
{
//Bubble Sort - 2016年10月26日14:53:26
class Program
{
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();

sw.Start();

int temp = 0;
int[] arry = { 12, 45, 67, 52, 56, 2, 76, 33, 10, 41, 45, 345, 56, 23, 543, 56, 4, 2, 56, 888, 33, 234, 565, 35, 56, 456, 345, 234, 654, 234, 356, 234, 456, 42342 };

//排序前输出
Console.WriteLine("选择排序算法输出:");
Console.WriteLine("排序前的数组:");
foreach (var item in arry)
{
Console.Write(item + " ");
}
Console.WriteLine();

//核心冒泡算法 - Bubble
for (int i = 0; i < arry.Length - 1; i++)
{
for (int j = 0; j < arry.Length - i - 1; j++)
{
if (arry[j] < arry[j + 1])
{
temp = arry[j];
arry[j] = arry[j + 1];
arry[j + 1] = temp;
}
}
}

sw.Stop();

//排序后输出
Console.WriteLine("排序后的数组:");
foreach (var items in arry)
{
Console.Write(items + " ");
}
Console.WriteLine();

TimeSpan ts2 = sw.Elapsed;
Console.WriteLine("总共花费{0}ms.", ts2.TotalMilliseconds);

Console.ReadKey();
}
}
}     其中核心代码段:
     冒泡(Bubble Sort):

//核心冒泡算法 - Bubble
for (int i = 0; i < arry.Length - 1; i++)
{
for (int j = 0; j < arry.Length - i - 1; j++)
  {
if (arry[j] < arry[j + 1]
{
temp = arry[j
 arry[j] = arry[j + 1];
arry[j + 1] = temp;
}
}
}       选择:
//核心直接选择算法 -- Select
for (int i = 0; i < arry.Length; i++)
{
int minIndex = i;
for (int j = i + 1; j < arry.Length; j++)
{
if (arry[i] < arry[j])
{
minIndex = j;
}
}
//抽出了交换部分代码
temp = arry[i];
arry[i] = arry[minIndex];
arry[minIndex] = temp;
}      输出结果:
      冒泡:



     选择:



      看得出,二者都顺利第完成了对这个33个数进行了排序,可是会发现我用StopWatch监控仅仅33个数字,二者时差就差了0.4s,很惊讶,为啥子会这样?那上百万条还不得了啊~啊!

      现在分析两种算法的核心代码,发现他们都有两层for嵌套,而且外层基本上一样,查别在于第二层for循环,“冒泡”是相邻都要比一下,当然“选择”也都要和内层里的第一个比一下,但是不一样的地方在于这里:

       冒泡:

for (int j = 0; j < arry.Length - i - 1; j++)
{
if (arry[j] < arry[j + 1])
{
temp = arry[j];
arry[j] = arry[j + 1];
arry[j + 1] = temp;
}
}
}
      选择:

for (int j = i + 1; j < arry.Length; j++)
{
if (arry[i] < arry[j])
{
minIndex = j;
}
}      可以说,通过这里就发现为什么选择要快一点了,因为发现需要交换的时候,选择算法并没有进行交换,而是外层循环这一趟走完之后,才交换,而且最多交换1次,可是冒泡一趟下来,最多会交换n-1次!
以前这里一直比较晕乎,终于搞清楚了。

       对于小数据量,没有效率要求的排序,二者都可以,而且“选择”的性能是“冒泡”的7倍左右(网上有统计),但是对于大数据量来说,二者都不太合适,需要更加优秀的算法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: