前言:
冒泡排序是交换排序的一种,通过C#代码实现来理解冒泡的思想。
它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
形象图:
例:
已知一组无序数据a[1]、a[2]、……a[n],需将其按
升序
(从小到大)排列。
1.首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。
2.然后继续比较a[2]与a[3]的值,若a[2]大于a[3]则交换两者的值,否则不变,以此类推。
3.最后比较a[n-1]与a[n]的值。这样处理一轮后,a[n]的值一定是这组数据中最大的。
4.再对a[1]~a[n-1]以相同方法处理一轮,则a[n-1]的值一定是a[1]~a[n-1]中最大的。
5.再对a[1]~a[n-2]以相同方法处理一轮,以此类推。共处理n-1轮后a[1]、a[2]、……a[n]就以升序排列了。
*降序排列与升序排列相类似,若a[1]小于a[2]则交换两者的值,否则不变,后面以此类推。
总的来讲,每一轮排序后最大(或最小)的数将移动到数据序列的最后,理论上总共要进行
n(n-1)/2次
交换。
代码实现:
static void Main(string[] args) { int[] nums = new int[] { 9, 8, 7, 6, 5, 4, 3, 2, 1 }; //定义一个Int 数组进行存放待排序的数 int temp = 0; //定义一个值为0的变量 for (int j = 0;j< nums.Length -1; j++)//外循环 { for (int i = 0; i < nums.Length-1-j; i++)//内循环 { if (nums[i] > nums[i + 1])//如果两个数比较,后一个比前一个大 { temp = nums [i]; nums[i] = nums[i+ 1]; nums[i+1] = temp; //通过第三变量来交换值 } } } for (int i = 0; i <nums.Length ; i++) { Console.WriteLine(nums[i]+"\t"); } //循环输出经过排序的数 Console.ReadKey(); }
小结:
这里采用的是为整型数组添加扩展方法实现的冒泡排序。
优点:
稳定
缺点:
慢,每次只移动相邻的两个元素。
时间复杂度:理想情况下(数组本来就是有序的),此时最好的时间复杂度为
o(n)
,最坏的时间复杂度(数据反序的),此时的时间复杂度为o(n*n) 。冒泡排序的平均时间负责度为o(n*n).