冒泡排序
数据结构 | 数组 |
---|---|
最差时间复杂度 | O(n^2) |
最优时间复杂度 | O(n) |
平均时间复杂度 | O(n^2) |
空间复杂度 | O(1) |
排序方式 | in-place |
稳定性 | 稳定 |
比较次数 | n*(n-1)/2 |
思路和代码:
//第一种,arr[j] 和arr[j + 1] 比较 如果 前者比后者大,把前者和后者调换顺序,两两调换后一轮下来 最大的会被排到最后去。外层循环arr.length-1次。 //每一轮j都从0开始,每次i轮排序,后面的i个数字已经是排好的,所以后面的每轮都不用理他了,也就是 arr.length-1-i 往后的数不用管了。 //如上: //第一轮有4个数字 i为0 ,那么arr.length-1-i 为3,也就是下标是3以后的可以不用管,3往后没有数字,所以第一轮所有的数字都要参加比较。 //实现代码如下: public override void Sort() { int SumCount = 0; int iCount = 0; for (int i = 0; i < arr.Length - 1; i++) { iCount++; int jCount = 0; bool flag = true; for (int j = 0; j < arr.Length - i - 1; j++) { jCount++; SumCount++; if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; flag = false; } } Console.WriteLine($"i:{iCount} j:{jCount}"); if (flag) break; } base.output(arr); Console.WriteLine($"SumCount:{SumCount}"); } //第二种思路,由后向前比较,最小的会排在最前面 public override void Sort2() { int iCount = 0; int SumCount = 0; for (int i = 0; i < arr2.Length - 1; i++) { iCount++; int jCount = 0; bool flag = true; for (int j = arr2.Length - 1; j > i; j--) { jCount++; SumCount++; if (arr2[j] < arr2[j - 1]) { int temp = arr2[j]; arr2[j] = arr2[j - 1]; arr2[j - 1] = temp; flag = false; } } Console.WriteLine($"i:{iCount} j:{jCount}"); if (flag) break; } base.output(arr2); Console.WriteLine($"SumCount:{SumCount}"); }
结果: