昨天学习了如何用Split方法对数组进行处理,还学习了如何用Array.Sort()方法对数组进行排序,今天来研究下冒泡算法
冒泡算法(Bubble Sort)先画表来说明下:
比如说,我们有个八位的int型数列,int[8] intArray=(8,7,6,5,4,3,2,1);那么,假设它开始在内存中是这样的
序号:0、1、2、3、4、5、6、7值值:8、7、6、5、4、3、2、1(不写两个值对不齐)
我们想对intArray中的值从小到大排序,可以用相邻的两个数两两比较,在把较大的数移动到后一位去,那么,要将8移动到7号位去,要将他移动7次。
移动后的结果
序号:0、1、2、3、4、5、6、7
值值:7、6、5、4、3、2、1、8
搞定了8,那么我们就可以对7进行操作了。
序号:0、1、2、3、4、5、6、7
值值:6、5、4、3、2、1、7、8
............................................................................后面的以此类推
也就是说,如果要排一个8个数值的数组,最多会进行7+6+5+4+3+2+1次操作(等差数列求和)
那么现在进入代码编写:
第一次写成这样:
namespace 练习5._5排序与数组处理
{
class Program
{
static void Main(string[] args)
{
string str = Console.ReadLine();
string[] strArray = str.Split(' ');
int[] numArray = new int[strArray.Length];
int n = 0;
for (int i = 0; i < strArray.Length; i++)
{
int temp = Convert.ToInt32(strArray[i]);
numArray[i] = temp;
}
//冒泡法方法如下
for (int j = 1; j <= numArray.Length-1; j++)
{
//让下面的for循环执行numArray.Length-1次
for (int i = 0; i < numArray.Length - 1; i++)//注意!注意!注意!
{
//numArray[i]与numArray[i+1]作比较,将大的放在后面
if (numArray[i + 1] < numArray[i])
{
int temp = numArray[i];
numArray[i] = numArray[i + 1];
numArray[i + 1] = temp;
}
n++;
}
}
for (int i = 0; i < numArray.Length; i++)
{
Console.Write(numArray[i] + " ");
}
Console.WriteLine("for循环执行了{0}次", n);
Console.ReadKey();
}
}
}</span>
注意第26行的for循环,
for (int i = 0; i < numArray.Length - 1; i++)</span>
它在经过一次排序之后,第二次仍然会老老实实的去对已经排好序列的元素进行操作。
假定数列为N,如果最大的元素已经放在了最后面去了,那么下一次循环,我们可以只对前面N-1个数进行比较排序了,对吧。
假定数列为N,如果最大的元素已经放在了最后面去了,那么下一次循环,我们可以只对前面N-1个数进行比较排序了,对吧。
所以,第26行的for循环,可以做如下修改:
for (int i = 0; i < numArray.Length - j; i++)</span>
每执行一次就不管已经移到最右边的元素。
这样可以减少for循环的循环次数,程序中第35行的n++就是为了检验for循环次数而设的。