冒泡排序及其优化
冒泡排序核心思想
冒泡排序的核⼼思想就是:两两相邻的元素进⾏⽐较
1题目举例
给出一个倒序数组:arr[10]={9,8,7,6,5,4,3,2,1,0}
请排序按小到大输出
1.1题目分析
这是一个完全倒序的数组,所以确定冒泡排序的趟数,就是需要九趟冒泡排序
1.2冒泡排序函数实现
//冒泡排序函数
void bubble_sort(int* arr, int sz)//参数接收数组元素个数
{
//确定冒泡排序趟数
int i = 0;
for (i = 0; i < sz - 1; i++)
{
//一趟冒泡排序
int j = 0;
for (j = 0; j < sz - 1 - i; j++)//确定交换的对数
{
if (*(arr + j) > *(arr + j + 1))
{
//交换
int temp = *(arr + j);
*(arr + j) = *(arr + j + 1);
*(arr + j + 1) = temp;
}
}
}
}
1.3打印数组函数实现
//打印数组函数
void print(int* arr, int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", *(arr++));
}
}
1.4完整代码实际代入实现
#include<stdio.h>
//冒泡排序
//冒泡排序函数
void bubble_sort(int* arr, int sz)//参数接收数组元素个数
{
//确定冒泡排序趟数
int i = 0;
for (i = 0; i < sz - 1; i++)
{
//一趟冒泡排序
int j = 0;
for (j = 0; j < sz - 1 - i; j++)//确定交换的对数
{
if (*(arr + j) > *(arr + j + 1))
{
//交换
int temp = *(arr + j);
*(arr + j) = *(arr + j + 1);
*(arr + j + 1) = temp;
}
}
}
}
//打印数组函数
void print(int* arr, int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", *(arr++));
}
}
int main()
{
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz);
print(arr, sz);
return 0;
}
1.5运行结果展示
2.题目举例
假设给出一个极端数组arr[10]={9,0,1,2,3,4,5,6,7,8}
给他排序,按小到大输出
2.1题目分析
我们观察题目就会发现,这个数组只需1趟冒泡排序就会完成排序要求,但是,如果我们依旧使用上面那个冒泡排序的代码,他就会任然在一趟排好的情况下,继续两两比较,这样,就会大大浪费时间,所以我们就可以对以上冒泡排序代码进行优化。
2.2冒泡排序函数优化实现
//冒泡排序函数优化
void bubble_sort(int* arr, int sz)//参数接收数组元素个数
{
//确定冒泡排序趟数
int i = 0;
for (i = 0; i < sz - 1; i++)
{
int flag = 1;//假设数组是有序的
//一趟冒泡排序
int j = 0;
for (j = 0; j < sz - 1 - i; j++)//确定交换的对数
{
if (*(arr + j) > *(arr + j + 1))
{
//交换
int temp = *(arr + j);
*(arr + j) = *(arr + j + 1);
*(arr + j + 1) = temp;
flag = 0;//不是有序
}
}
if (flag == 1)//如果已经有序,就跳出循环
{
break;
}
}
}
2.3打印数组函数实现
//打印数组函数
void print(int* arr, int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", *(arr++));
}
}
2.4完整代码优化实际代入实现
//冒泡排序优化
//冒泡排序函数优化
void bubble_sort(int* arr, int sz)//参数接收数组元素个数
{
//确定冒泡排序趟数
int i = 0;
for (i = 0; i < sz - 1; i++)
{
int flag = 1;//假设数组是有序的
//一趟冒泡排序
int j = 0;
for (j = 0; j < sz - 1 - i; j++)//确定交换的对数
{
if (*(arr + j) > *(arr + j + 1))
{
//交换
int temp = *(arr + j);
*(arr + j) = *(arr + j + 1);
*(arr + j + 1) = temp;
flag = 0;//不是有序
}
}
if (flag == 1)//如果已经有序,就跳出循环
{
break;
}
}
}
//打印数组函数
void print(int* arr, int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", *(arr++));
}
}
int main()
{
int arr[] = { 9,0,1,2,3,4,5,6,7,8 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz);
print(arr, sz);
return 0;
}