- 原理
重复地走访过要排序的元素列,依次比较两个相邻的元素。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素已经排序完成。 - 代码
//创建数组
int[] nums = new int[] { 23, 67, 3, 21, 19,36 };
//外循环:循环次数
//数组的长度为6,但i的初始化为0,所以nums.Length-1表示为整个数组的长度(0——5)
//用二重循环实现冒泡,外循环变量设为i,内循环变量设为j
//外循环重复6次,内循环也重复6次
for (int i=0;i< nums.Length-1; i++)
{
//内循环:计算比较两个数的大小,nums.Length-1-i是为了减少计算,提高性能
//比如在循环3的时候,当计算nums.Length-1-2,是因为之前23和3,67和3已经比较过了,那么在后边就不需要重复的比较
//如果是从小到大排序,那么每次内循环将会把较大值移到后边
for(int j = 0; j < nums.Length-1-i; j++)
{
if (nums[j] > nums[j + 1])
{
//定义一个变量a,nums[j] > nums[j + 1]成立,将nums[j]的值赋给a(存放在中间变量a里边)
int a = nums[j];
//将nums[j + 1]的值赋给nums[j](被比较完的往前排)
nums[j] = nums[j + 1];
//将比较大的值赋给nums[j + 1],在此次循环完后,将作为下一次的初始值进行比较
nums[j + 1] = a;
}
}
}
for (int j = 0; j < nums.Length; j++)
{
Console.Write(nums[j] + "\t");
}
Console.ReadKey();
- 说明
排序数组:int[] nums = new int[] { 23, 67, 3, 21, 19 ,35};
第一趟排序:
第一次排序:23和67比较,23小于67,不交换位置——23 67 3 21 19 35
第二次排序:67和3比较,67大于3,交换位置——23 3 67 21 19 35
第三次排序:67和21比较,67大于21,交换位置——23 3 21 67 19 35
第四次排序:67和19比较,67大于19,交换位置——23 3 21 19 67 35
第五次排序,67和35比较,67大于35,交换位置——23 3 21 19 35 67
第二趟排序
第一次排序:23和3比较,23大于3,交换位置——3 23 21 19 35 67
第二次排序:23和21比较,23大于21,交换位置——3 21 23 19 35 67
第三次排序:23和19比较,23大于19,交换位置——3 21 19 23 35 67
第四次排序:23和35比较,23小于35,不交换位置——3 21 19 23 35 67
第三趟排序
第一次排序:3和21比较,3小于21,不交换位置——3 21 19 23 35 67
第二次排序:21和19比较,21大于19,交换位置——3 19 21 23 35 67
第三次排序:21和23比较,21小于23,不交换位置——3 19 21 23 35 67
第四趟排序
第一次排序:3和19比较,3小于19,不交换位置——3 19 21 23 35 67
第二次排序:19和21比较,19小于21,不交换位置——3 19 21 23 35 67
第五趟排序
第一次排序:3和19比较,3小于19,不交换位置——3 19 21 23 35 67
最终结果:3 19 21 23 35 67
根据以上可得规律:N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次;用双重循环语句,外层(外循环)控制循环多少趟,内层(内循环)控制每一趟的循环次数。
冒泡排序的优点:每进行一趟排序,就会少比较一次,因为每进行一趟排序都会找出一个最值。
- 小结
不要遇到一点困难就悲观,不要遇到一点挑战就想投降,投降没有出路,只会被人蹂躏。要敢于亮剑,提刀跨马勇于杀敌。