/// <summary>
/// 冒泡排序
/// </summary>
public string Sort(int[] scoreArray)
{
if(scoreArray.Length == 0)
{
return "数组无值";
}
#region 核心算法
//n个数两两对比,比较n-1次即可
for (int i = 0; i < scoreArray.Length-1; i++) // i
{
//排完一轮,最大的数已经排到了最后面,-i是为了固定已经排好的最值,并有缩小范围的作用
for (int j = 0; j <scoreArray.Length-1-i ; j++) // j
{
//如果前面的大鱼后面的,将大的放到后面
if (scoreArray[j] > scoreArray[j + 1])
{
//交换
int temp = scoreArray[j];
scoreArray[j] = scoreArray[j + 1];
scoreArray[j + 1] = temp;
}
}
}
#endregion 核心算法
StringBuilder s = new StringBuilder(10);
foreach (int item in scoreArray)
{
s.Append(item.ToString()+",");
}
s = s.Remove(s.Length - 1, 1);
return s.ToString();
}
解释:
i:比较了多少轮
-i:每一轮排除上一轮已经比较出的最大/最小值(相对于每一轮的最大/最小值)的个数
第1轮 排除0个
第2轮 排除1
。。。
第n轮 排除n-1
总共有需要多少轮?也就是n是多少?很容易想到length-1,假设数组长度为2,那么比较一次就OK了。最后一轮排除的最大/最小值的个数是: length-2
得出外层循环的写法 for (int i = 0; i < scoreArray.Length-1; i++) ,此处i的最大值为scoreArray.Length-2应该很容易想明白!
补充:要将n个数进行排序,那么要排多少轮呢?n-1轮,第一轮选出最大的,第二轮选出第二大的。。最后一轮选出次最小的(这一轮只剩两个数了),剩下的就是最小的不用再进行比较!
第一轮的比较范围是1至n
第二轮的比较范围是1至n-1
。
。
。
最后一轮的比较范围是1至2。
//i 为要对比的轮数
for(int i=0; i<n-1; i++)
{
//j为每轮比较的范围
for(int j=0; j<n-i-1)
{
//这一轮中的相邻两个数两两对比
if(a[j]>a[j+1])
{
//如果下面的气泡比上面的大,则让下面的气泡冒到上面
int temp = a[j];
a[j] = a[j+1];
a[j+1]=temp;
}
}
}