冒泡排序(个人练习理解)
冒泡排序,即依次比较相邻的两个元素,根据要求顺序进行排序,不符合顺序的话进行交换。直到没有需要交换的为止。
例:2,3,1,5,9,8 (小到大)
需要从第一位开始与相邻的比较(即数组下标0),2<3,不用交换,再以第二位与第三位比较,接着按顺序继续比较,即判断a[i]与a[i+1]。;
即第一趟:2,1,3,5,8,9
之后以前一趟的结果继续进行相邻比较。
第二趟:1,2,3,5,8
无交换即排序完成。
C#代码
//c#代码
string str=Console.ReadLine();//输入
string [] strarray=str.Split(" ");//以空格为分隔
int [] target=new int[strarry.Length];//定义另一个数组以保存排序后的数组
for(int i=0;i<strarray.Length;i++)
{
target[i]=int.Phase(strarray[i]);//phase将字符串转换为其他数据类型
}
//确定循环趟数,在运算过程最多是会有length-1趟
for(int i=0;i< target.Length-1;i++)
{
for(int j=0;j<target.Length-1 ;j++)//不断相邻比较,在最后一位时,若+1将超出数组,所以要length-1;
{
if(target[j]>target[j+1])
{
int temp=0;
temp=target[j];
target[j]=target[j+1];
target[j+1]=temp;
}
}
}
//另一种。可见每趟过后最大的都将排到最后,我们可以在每一趟过后,
//再次排序的时候,不去管最后一位,即下一次排序时少一位
//此时,比较时的次数就要与趟数有关了如下(另外在第一种j的for循环中将j<target.Length-1再减i是同样的效果)
for(int i=target.Length;i>0;i--)
{
for(int j=0;j<i-1;i++)
{
if(target[j]>target[j+1])
{
int temp=0;
temp=target[j];
target[j]=target[j+1];
target[j+1]=temp;
}
}
}
//遍历输出数组target即可
foreach(int i to target)
{
Console.Write(i);
}
优化
看上面的例子,可见第二趟就可以结束了,但上面代码虽然是优化了让每次去掉最后一位,但排完序后,它可能还会继续比较,此时我们要想办法去确定没有进行交换的了。
//以上面没写的情况为例
for(int i=0;i< target.Length-1;i++)
{
//定义一个变量表示是否发生交换,每一趟开始前,先重置为没有发生交换
bool change=false;//也可以用其他数据类型表示
for(int j=0;j<target.Length-1-i ;j++)//每次都会使最后一位去掉;
{
if(target[j]>target[j+1])//交换
{
int temp=0;
temp=target[j];
target[j]=target[j+1];
target[j+1]=temp;
//发生交换 ,将change的值改变
change=true;//表示有变换
}
//在运行比较后发现没有交换,此时说明排序完成,直接跳出循环即可。
if(change==false)
break;//跳出整个循环。
}
}