C语言学习笔记_冒泡排序及其简单优化

281 阅读1分钟

冒泡排序及其简单优化

当我们想给某个整型数组进行排序时,可能大家第一时间就会想到冒泡排序,虽然冒泡排序不是最牛逼的排序方法,但一定大家早有耳熟,下面带来冒泡排序的实现!

分为四个模块:

  • BubbleSort函数
  • 主函数
  • 所需头文件
  • 冒泡优化

BubbleSort函数

错误示范

void BubbleSort(int* arr)
{
    int size = sizeof(arr)/sizeof(a[0]); //这里是错误的!!!
	int i = 0;
	for (i = 0; i < size - 1; i++)
	{
		int j = 0;
		for (j = 0; j < size - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}

大家可能会出现以上错误,在BubbleSort函数计算数组的大小,此时计算所得结果恒为1,因为函数的形参为指针,此时sizeof()函数计算的为形参(此处为一个指针变量)的大小,故计算size为1,根本不会进入循环体~

正确示范

void BubbleSort(int* arr, int size)
{
	int i = 0;
	for (i = 0; i < size - 1; i++)
	{
		int j = 0;
		for (j = 0; j < size - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}

将数组的size作为参数传给BubbleSort函数,在主函数内计算数组的大小~

主函数

int main()
{
	int arr[5] = { 0 };
	int size = sizeof(arr) / sizeof(arr[0]);//计算数组大小
	int i = 0;
	for (i = 0; i < 5; i++)//数组输入
	{
		scanf("%d",&arr[i]);
	}
	BubbleSort(arr, size);//数组排序
	for (i = 0; i < size; i++)//排序后数组输出
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

所需头文件

#include <stdio.h>

冒泡优化

假如我们给定的数组本来就是有序,那么其实我们只需比较一趟即可,设置一个标志数,假如第一趟排序未发生交换,则直接退出循环

void BubbleSort(int* arr, int size)
{
	int i = 0;
	for (i = 0; i < size - 1; i++)
	{
		int j = 0;
		int flag = 1;//设置标志
		for (j = 0; j < size - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				flag = 0;//若发生交换则标志变为0
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
		if (1 == flag)//第一趟未发生交换 排序直接结束
			break;
	}
}