冒泡排序的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。
由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。
冒泡排序有两个很明显的优势:
1.“编程复杂度”很低,很容易写出代码;
2.具有稳定性,这里的稳定性是指原序列中相同元素的相对顺序仍然保持到排序后的序列,而堆排序、快速排序均不具有稳定性。
下面通过一个例子来了解冒泡排序的具体含义:
{130, 28, 345, 299, 40, 30, 201}
第一遍循环:
由此思想,我们可以实现冒泡排序的代码:
namespace BubbleSort { class Program { private void Func(int[] Arg) { //外循环每次把参与排序的最大数排在最后 for (int i = 1; i < Arg.Length; i++) { int a = 0; // 临时变量 //内层循环负责对比相邻的两个数,并把最大的排在后面 for (int j = 0; j < Arg.Length-i; j++) { //如果前 一个数大于后一个数,则交换两个数 if (Arg[j] > Arg[j + 1]) { a = Arg[j + 1]; Arg[j + 1] = Arg[j]; Arg[j] = a; } } //直接打印 //Console.WriteLine("{0},{1},{2},{3},{4},{5},{6}", Arg[0], Arg[1], Arg[2], Arg[3], Arg[4], Arg[5], Arg[6]); //Console.ReadLine(); //用一个循环访问数组里的元素并打印 for (int k = 0; k < Arg.Length; k++) { Console.WriteLine(Arg[k]); } Console.ReadLine(); } } static void Main(string[] args) { Program p = new Program(); int[] Arg = { 130, 28, 345, 299, 40, 30, 201 }; p.Func(Arg); } } }
由结果我们知道,冒泡排序是经过n-1趟子排序完成的,即使我们在第五次循环就已经得出了想要的结果,但是还是循环了6次。
由此我们可以看到对数据庞大的排序,冒泡排序并不适合。
其实我们可以设置一个标志位来解决这个问题,具体方法如下:
namespace BubbleSort { class Program { private void Func(int[] Arg) { int Flag = 1; //标志位 //外循环每次把参与排序的最大数排在最后 for (int i = 1; i < Arg.Length; i++) { if (Flag == 1) { int a = 0; // 临时变量 Flag = 0; //内层循环负责对比相邻的两个数,并把最大的排在后面 for (int j = 0; j < Arg.Length - i; j++) { //如果前 一个数大于后一个数,则交换两个数 if (Arg[j] > Arg[j + 1]) { a = Arg[j + 1]; Arg[j + 1] = Arg[j]; Arg[j] = a; Flag = 1; } } //直接打印 Console.WriteLine("{0},{1},{2},{3},{4},{5},{6}", Arg[0], Arg[1], Arg[2], Arg[3], Arg[4], Arg[5], Arg[6]); Console.ReadLine(); ////用一个循环访问数组里的元素并打印 //for (int k = 0; k < Arg.Length; k++) //{ // Console.WriteLine(Arg[k]); //} //Console.ReadLine(); } } } static void Main(string[] args) { Program p = new Program(); int[] Arg = { 130, 28, 345, 299, 40, 30, 201 }; p.Func(Arg); } } }