排序算法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)的数组,使用#是不可靠的!!!

posted @ 2019-11-08 09:51  Fflyqaq  阅读(238)  评论(0编辑  收藏  举报