c#之冒泡排序
---恢复内容开始---
冒泡排序
前言:在之前看过的一些博客和视频,感觉效果都还不错,但是还是总结出自己的一些思路,因为之前看过传智播客的视频,老师讲的也是挺不错的,但是由于这个一个比较基础并且比较重要的东西,因为面试的时候会用的到,还是亲自来写一下来加深印象。
冒泡排序的定义:就是将数组中的元素按照从大到小或者是从小到大的顺序来进行排列。好的那么接下来跟着我的思路一起来看吧...
一.首先我们先声明一个有规律的数组。
代码如下:
1 int[] nums={9,8,7,6,5,4,3,2,1,0};
二:首先对于冒泡排序我自己的理解就是:我们数组中每一个元素一次的跟下一个元素进行比较,如果我当前的元素大于我后面的元素,就进行两两的交换,首先我们声明了一个有规律的数组,如上,
我们一趟一趟的进行分析:
分析如下:
1 第一趟比较:8 7 6 5 4 3 2 1 0 9 交换了9次 i=0 j=nums.Length-1-i 2 第二趟比较:7 6 5 4 3 2 1 0 8 9 交换了8次 i=1 j=nums.Length-1-i 3 第三趟比较:6 5 4 3 2 1 0 7 8 9 交换了7次 i=2 j=nums.Length-1-i 4 第四趟比较:5 4 3 2 1 0 6 7 8 9 交换了6次 i=3 j=nums.Length-1-i 5 第五趟比较:4 3 2 1 0 5 6 7 8 9 交换了5次 i=4 j=nums.Length-1-i 6 第六趟比较:3 2 1 0 4 5 6 7 8 9 交换了4次 i=5 j=nums.Length-1-i 7 第七趟比较:2 1 0 3 4 5 6 7 8 9 交换了3次 i=6 j=nums.Length-1-i 8 第八趟比较:1 0 2 3 4 5 6 7 8 9 交换了2次 i=7 j=nums.Length-1-i 9 第九趟比较:0 1 2 3 4 5 6 7 8 9 交换了1次 i=8 j=nums.length-1-i
三:因为我们声明的是一个有规律的数组,首先我们先要看我们比较的趟数,如上应该是9趟,也就是数组的长度减一(nums.Length-1),代码如下:
1 //第一个for循环声明了我们要比较的趟数 (nums.Length - 1):数组的长度减一 2 for (int i = 0; i < nums.Length - 1; i++) 3 { 4 5 }
四:ok,第一个for循环出来了,那我们看我们如上的规律显示,当外面的for循环每执行一次的时候,里面就交换n次,这时候我们就考虑使用for循环的嵌套了(这是传智播客老师讲的,感觉说的不错),那里面的for循环如何写呢??是我们接下来要考虑的问题,当我们第一次比较的时候(也就是i=0的时候),j=nums.Length-1-i(也就是里面的for循环执行9次),当我们第二次比较的时候(也就是i=1的时候),j=nums.Length-1-i(也就是里面的for循环执行8次),这样话我们是不是已经找到规律了,规律如下:
j=nums.Length-1-i
这样的话第二个for循环是不是也就可以写出来了,代码如下:
for(int j=0;j<nums.Length-1-i;j++) { }
五:接下来进行交换变量了(交换变量也属于面试题,在别的博客中在进行详细的解释),最简单的方式就是声明一个第三方的变量,直接奉上代码,如下:
int temp = nums[j]; nums[j] = nums[j + 1]; nums[j + 1] = temp;
完整的代码如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 冒泡排序 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 //int[] nums = { 5, 9, 8, 7, 6, 12, 4 }; 14 int[] nums = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; 15 //第一个for循环声明了我们要比较的趟数 (nums.Length - 1):数组的长度减一 16 for (int i = 0; i < nums.Length - 1; i++) 17 { 18 for (int j = 0; j < nums.Length - 1 - i; j++) 19 { 20 if (nums[j] > nums[j + 1]) 21 { 22 int temp = nums[j]; 23 nums[j] = nums[j + 1]; 24 nums[j + 1] = temp; 25 } 26 } 27 } 28 for (int i = 0; i < nums.Length; i++) 29 { 30 Console.WriteLine(nums[i]); 31 } 32 Console.ReadKey(); 33 } 34 } 35 }
代码运行如下:
六:接下来我们需要考虑一个问题:大家看我这条的代码是不是j=nums.Length-1-i
为什么要写 -i 呢???? 其实我们不写减i的话代码也是没有任何的问题的。在这里推荐大家都写上,为什么呢?主要是检测大家是否对冒泡排序是否真正的理解,因为每当我们遍历一趟时,就已经将我们当前的趟数的最大值放在的最后了,所以我们手动的减一,也是为了减少性能的消耗。下面为大家展示一下没有规律的数组,如下:
int[] nums = { 5, 9, 8, 7, 6, 12, 4 }; 第一趟比较:5 8 7 6 9 4 12 第二趟比较:5 7 6 8 4 9 12 第三趟比较:5 6 7 4 8 9 12 第四趟比较:5 6 4 7 8 9 12 第五趟比较:5 4 6 7 8 9 12 第六趟比较:4 5 6 7 8 9 12
好的,冒泡排序已经讲解完了,如果有问题请大家踊跃的发言,希望和别人共同的进步,谢谢大家!!!---恢复内容结束---