原理:将数组元素中相邻两个元素的值进行比较,将较小的数放到前面,每一次交换都将最大的数放到最后,依次交换后最终将数组中的元素从小到大排序。具体如下:
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个;
- 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数;
- 针对所有的元素重复以上的步骤,除了最后一个;
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
注:数组中相同元素的前后顺序并没有改变,冒泡排序是一种稳定排序算法。
以下是C#实现冒泡排序的过程与代码:
比如数组a中为{1,6,4,3,2},长度为5;
第一轮比较需要比较4(=5-1)次;第二轮比较需要比较3(=5-2)次;第三轮比较需要比较2(=5-3)次;第四轮比较需要比较1(=5-4)次。
因此外层i(表示比较的轮数)的取值为0~a.Length-1,内层j(表示每轮比较的次数)的取值为0~a.Length-i。
但在比较a[j]>a[j+1]时,会存在index(索引)溢出的情况,所以j的取值应为0~a.Length-i-1。
排序过程 第一轮(i=0) 第二轮(i=1) 第三轮(i=2) 第四轮(i=3) 第一次(j=0) 1,6
1,4 1,3 1,3 第二次(j=1) 6,4 4,3 3,2 第三次(j=2) 6,3 4,2 第四次(j=3) 6,2 排序后的结果 1,4,3,2,6 1,3,2,4,6 1,2,3,4,6 1,2,3,4,6
class Program
{
static void Main(string[] args)
{
int temp = 0;
int[] arr = {23, 44, 66, 76, 98, 11, 3, 9, 7};
Console.WriteLine("排序前的数组:"); //输出排序前的数组
foreach (int item in arr) //foreach语句输出数组arr的元素
{
Console.Write(item + " "); //不换行输出
}
Console.WriteLine(); //换行
for (int i = 0; i < arr.Length - 1; i++) //外层循环代表比较的轮数;
{
//内层循环代表每轮比较的次数
for (int j = 0; j < arr.Length - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
}
Console.WriteLine("排序后的数组:");
foreach (int item in arr)
{
Console.Write(item+" ");
}
Console.WriteLine();
Console.ReadKey();
}
}
如果要对数组中的元素从大到小排序,只需要将 if(a[j]>a[j+1]) 语句更改成 if(a[j]<a[j+1]) 即可。
System.Array 是所有数组的基类,其提供的属性和方法也可以被用到任何数组中。
数组中常用的其他方法:
编号 | 方法 | 描述 |
1 | Clear() | 清空数组中的元素 |
2 | Sort() | 冒泡排序,从小到大排序数组中的元素 |
3 | Reverse() | 将数组中的元素逆序排列(搭配Sort方法可以实现将数组元素从大到小的排序) |
4 | IndexOf() | 查找数组中是否含有某个元素,返回该元素第一次出现的位置,如果没有与之匹配的元素,则返回 -1 |
5 | LastIndexOf() | 查找数组中是否含有某个元素,返回该元素最后一次出现的位置 |
上述实现冒泡排序的代码可以简写成:
class Program
{
static void Main(string[] args)
{
int[] arr = {23, 44, 66, 76, 98, 11, 3, 9, 7};
Console.WriteLine("排序前的数组:"); //输出排序前的数组
foreach (int item in arr) //foreach语句输出数组arr的元素
{
Console.Write(item + " "); //不换行输出
}
Console.WriteLine(); //换行
Array.Sort(arr); //数组提供的Sort方法实现冒泡排序
Console.WriteLine("排序后的数组:");
foreach (int item in arr)
{
Console.Write(item+" ");
}
Console.WriteLine();
Console.ReadKey();
}
}