目录
1 冒泡排序的原理
2 算法步骤
3 代码示例
3-1 C#代码示例
3-2 C++代码示例
冒泡排序(Bubble Sort)是一种简单的排序算法,它的基本思想是通过多次遍历待排序的数组,比较相邻元素的大小,并根据需要交换它们的位置,直到整个数组有序。
根据算法步骤书写以下代码:(优化前)
using System;
namespace ConsoleApplication1
{
internal class Program
{
private static int[] BubbleSort(int[] arr)
{
if (arr == null || arr.Length < 2) return arr;
for (int e = arr.Length - 1; e > 0; e--)
for (int i = 0; i < e; i++)
if (arr[i] > arr[i + 1])
Swap(arr,i,i+1);
return arr;
}
private static void Swap(int[] arr, int i, int j)
{
arr[i] ^= arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] ^= arr[j];
}
public static void Main(string[] args)
{
int[] arr = { 2, 5, 7, 9, 3, 1, 4, 6, 8 };
arr = BubbleSort(arr);
foreach (var value in arr)
{
Console.WriteLine(value);
}
}
}
}
仔细观察,可以发现该代码可以进行优化:
使用了异或运算来交换数组中两个元素的位置。异或运算的优点是不需要额外的临时变量,但存在一个问题:当i
和j
指向数组的同一个位置时,异或交换会将该位置的元素置为 0。例如:
int a = 5;
a ^= a; // a 变为 0
针对这个问题,我们对Swap方法添加对i
和j
是否相等的检查。
原始代码在每一轮排序中都会进行完整的比较和交换操作,即使数组已经有序也会继续执行,这会浪费一些不必要的计算资源。针对这一问题,我们可以对其添加一个布尔变量swapped
,用于记录每一轮排序中是否发生了元素交换。
优化后代码:
using System;
namespace ConsoleApplication1
{
internal class Program
{
private static int[] BubbleSort(int[] arr)
{
if (arr == null || arr.Length < 2) return arr;
for (int e = arr.Length - 1; e > 0; e--)
{
bool swapped = false;
for (int i = 0; i < e; i++)
if (arr[i] > arr[i + 1])
{
Swap(arr, i, i + 1);
swapped = true;
}
if(!swapped)break;
}
return arr;
}
private static void Swap(int[] arr, int i, int j)
{
if (i!= j)
{
arr[i] ^= arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] ^= arr[j];
}
}
public static void Main(string[] args)
{
int[] arr = { 2, 5, 7, 9, 3, 1, 4, 6, 8 };
arr = BubbleSort(arr);
foreach (var value in arr)
Console.WriteLine(value);
}
}
}
运行测试:
#include
#include
// 交换数组中两个元素的位置
void Swap(std::vector& arr, int i, int j) {
if (i != j) {
arr[i] ^= arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] ^= arr[j];
}
}
// 冒泡排序函数
std::vector BubbleSort(std::vector arr) {
if (arr.size() < 2) return arr;
for (int e = arr.size() - 1; e > 0; e--) {
bool swapped = false;
for (int i = 0; i < e; i++) {
if (arr[i] > arr[i + 1]) {
Swap(arr, i, i + 1);
swapped = true;
}
}
if (!swapped) break;
}
return arr;
}
int main() {
std::vector arr = { 2, 5, 7, 9, 3, 1, 4, 6, 8 };
arr = BubbleSort(arr);
for (int value : arr) {
std::cout << value << std::endl;
}
return 0;
}
测试运行: