排序算法03-冒泡排序(用C++、C#、lua实现)
本文为排序算法-冒泡排序的代码实现。
作者水平比较差,有错误的地方请见谅。
1、冒泡排序
冒泡排序属于交换排序。
排序最好情况:为正序,需进行 1 趟排序,进行 n-1 次比较和0次移动数据。
排序最坏情况:为逆序,需进行 n-1 趟排序,进行 n^2/2 次比较和 n^2/2*3 次移动数据(每次交换都需要移动3次记录)。
平均比较次数:n^2/4
平均移动次数:n^2/4*3
平均时间复杂度:O(n^2)
平局空间复杂度:O(1)。因为只在交换位置时使用一个辅助空间做暂存记录。
2、C#实现
冒泡排序
BubbleSort.cs
public static class BubbleSort
{
public static void Bubble(int[] numbers)
{
if (numbers == null || numbers.Length < 2)
{
Console.WriteLine("参数数组有误");
return;
}
for (int i = 0; i < numbers.Length; i++)
{
for (int j = i + 1; j < numbers.Length; j++)
{
if (numbers[i] > numbers[j])
{
int temp = numbers[i];
numbers[i] = numbers[j];
numbers[j] = temp;
}
}
}
}
}
Program.cs
class Program
{
static void Main(string[] args)
{
int[] numbers = { 555, 3, -5, 20, 11 };
BubbleSort.Bubble(numbers);
for(int i = 0; i < numbers.Length; i++)
{
Console.Write(numbers[i] + " ");
}
Console.WriteLine();
Console.ReadKey();
}
}
3、C++实现
BubbleSort.cpp
///冒泡排序
class BubbleSort
{
public:
static void Bubble(int numbers[],int length);
};
void BubbleSort::Bubble(int numbers[],int length)
{
if (numbers == NULL || length < 2)
{
cout<<"参数数组有误"<<endl;
return;
}
for (int i = 0; i < length; i++)
{
for (int j = i + 1; j < length; j++)
{
if (numbers[i] > numbers[j])
{
int temp = numbers[i];
numbers[i] = numbers[j];
numbers[j] = temp;
}
}
}
}
main.cpp
int main()
{
int numbers[] = {555, 3, -5, 20, 11};
int length = sizeof(numbers)/sizeof(numbers[0]);
BubbleSort::Bubble(numbers,length);
for(int i=0;i<length;i++){
cout<<numbers[i]<<" ";
}
cout<<endl;
return 0;
}
4、lua实现
numbers = {555, 3, -5, 20, 11}
function BubbleSort(nums)
local length = #nums
if (nums == nil or length < 2) then
print("参数数组有误")
return
end
for i=1,length,1 do
for j=i+1,length,1 do
if (nums[i] > nums[j]) then
local temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
end
end
end
end
BubbleSort(numbers)
for i=1,#numbers,1 do
io.write(numbers[i] .. ' ')
end
print()
--#nums 获取数组长度
5、新知识和疑问
5.1 C++
int numbers[] = {555, 3, -5, 20, 11};
//使用这种方法来获取数组长度
//用数组总字节数/数组单个元素字节数
int length = sizeof(numbers)/sizeof(numbers[0]);
C++返回值无法是这种 int[] 类型的数组,要想返回数组需使用指针, int* 。
C++实现静态函数。
5.2 lua #号使用
在使用#获取数组长度时要注意必须为连续的数组。
在中间存在空洞(nil)的数组,使用#是不可靠的!!!