冒泡排序
部分内容引用自 知乎:程序员贺同学 整理的C++八股文
↑ 他总结分享的很棒
(1)冒泡排序
算法描述:
- ⽐较相邻的元素。如果第⼀个⽐第⼆个⼤,就交换它们两个;
- 对每⼀对相邻元素作同样的⼯作,从开始第⼀对到结尾的最后⼀对,这样在最后的元素应
- 该会是最⼤的数;
- 针对所有的元素᯿复以上的步骤,除了最后⼀个;
- ᯿复步骤 1~3,直到排序完成。
⽤⼀个例⼦,带你看下冒泡排序的整个过程。我们要对⼀组数据 4,5,6,3,2,1,从⼩到
到⼤进⾏排序。第⼀次冒泡操作的详细过程就是这样
可以看出,经过⼀次冒泡操作之后,6 这个元素已经存储在正确的位置上。要想完成所有数据
的排序,我们只要进⾏ 6 次这样的冒泡操作就⾏了。
#include <iostream>
#include <vector>
void BubbleSort(std::vector<int> &nums) {
int n = nums.size();
if (n <= 1) return;
bool is_swap;
for (int i = 1; i < n; ++i) {
is_swap = false;
for (int j = 1; j < n - i + 1; ++j) {
if (nums[j] < nums[j-1]) {
std::swap(nums[j], nums[j-1]);
is_swap = true;
}
}
if (!is_swap) break;
}
}
int main() {
std::vector<int> nums = {34,66,2,5,95,4,46,27};
BubbleSort(nums);
for (int num : nums) {
std::cout << num << " ";
}
// Output: 2 4 5 27 34 46 66 95
return 0;
}
C# 语言 实现冒泡排序
namespace 冒泡排序
{
class Program
{
// 从小到大排序
void BubbleSort( int [] nums)
{
for (int i = 0; i < nums.Length; i++)
{
bool swapped;
// 小于nums.Lenght-1-i 是因为 从左向右比较,右边会留下排好的,排好的不用再进行比较了。
for (int j = 0; j < nums.Length - 1 - i; j++)
{
swapped = false; //放里面 每次都初试为false, 可能循环过程中成为了true,改回来
if (nums[j] > nums[j + 1])
{
//C++直接用swap函数就行了,c#要自己写
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
//交换了就记一下
swapped = true;
}
if (!swapped) //如果没有发生交换,那么就是排好了,提前退出
{
break;
}
}
}
}
static void Main(string[] args)
{
Program program = new Program();
//int[] nums = { 5, 4, 7, 2, 3 };
int[] nums = new int[5] { 6, 3, 7, 4 ,9};
program.BubbleSort(nums);
//Console.WriteLine(nums); //笨蛋C# 这个函数不会输出数组里的元素,而是输出数组的类型
Console.WriteLine(string.Join(", ", nums)); //输出数组中的元素 要不就用for,foreach循环输出元素
Console.ReadKey();
}
}
}