冒泡排序及其简单优化
当我们想给某个整型数组进行排序时,可能大家第一时间就会想到冒泡排序,虽然冒泡排序不是最牛逼的排序方法,但一定大家早有耳熟,下面带来冒泡排序的实现!
分为四个模块:
- 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;
}
}