23人参与 • 2025-10-13 • C/C++
冒泡排序是最基础的排序算法之一,它的核心思想是通过相邻元素的比较和交换,将较大的元素逐步"冒泡"到数组的末尾。今天我们来分析三种不同的冒泡排序实现方式,每种都有其独特之处。
冒泡排序的基本原理很简单:重复遍历待排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作重复进行,直到没有再需要交换的元素,这意味着该数列已经排序完成。
时间复杂度:
空间复杂度:o(1)
int main()
{
int a[] = { 2,1,5,7,3,9,0,4,6,8 };
int temp = 0;
int n = sizeof(a) / sizeof(a[0]);
printf("%d\n",n);
for (int i = 0; i < n-1; i++)
{
for (int j = 0; j < n - 1 - i; j++)
{
if ( a[j] > a[j+1] )
{
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
for (int k = 0; k < n; k++)
{
printf("%d ", a[k]);
}
printf("\n");
return 0;
}int a[] = { 2,1,5,7,3,9,0,4,6,8 }; 创建待排序数组int n = sizeof(a) / sizeof(a[0]); 通过总字节数除以单个元素字节数得到元素个数for (int i = 0; i < n-1; i++)for (int j = 0; j < n - 1 - i; j++)优点:
缺点:
int main()
{
int a[] = { 2,1,5,7,3,9,0,4,6,8 };
int temp = 0, falg = 0;
int n = sizeof(a) / sizeof(a[0]);
printf("%d\n", n);
for (int i = 0; i < n - 1; i++)
{
int flag = 1; // 假设这趟已经有序了
for (int j = 0; j < n - 1 - i; j++)
{
if (a[j] > a[j + 1])
{
flag = 0; // 发生交换就说明,无序
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
if (flag == 1) // 这一趟没交换就说明已经有序了,后续无需排序了
{
break;
}
}
for (int k = 0; k < n; k++)
{
printf("%d ", a[k]);
}
printf("\n");
return 0;
}这个版本在基础版本上增加了一个重要的优化:提前终止机制。
int flag = 1; 在每轮排序开始前假设数组已经有序flag = 0; 标记数组仍无序优化效果:
实际应用价值:
这种优化在实际应用中非常有价值,因为很多场景下数据可能已经部分有序。
int main()
{
int a[] = { 2,1,5,7,3,9,0,4,6,8 };
int* p = a;
int temp = 0, falg = 0;
int n = sizeof(a) / sizeof(a[0]);
printf("%d\n", n);
for (int i = 0; i < n - 1; i++)
{
p = a; // 每趟开始时重置指针到数组开头
for (int j = 0; j < n - 1 - i; j++)
{
if (*p > *(p+1))
{
temp = *p;
*p = *(p + 1);
*(p + 1) = temp;
}
p++; // 指针后移
}
}
for (int k = 0; k < n; k++)
{
printf("%d ", a[k]);
}
printf("\n");
return 0;
}这个版本使用指针操作代替数组下标,展示了c语言指针的强大功能。
int* p = a; 指针p指向数组首地址if (*p > *(p+1)) 使用指针解引用比较元素值p++ 使指针指向下一个元素技术特点:
学习价值:
对于理解c语言指针和内存管理很有帮助,是进阶学习的良好示例。
int main()
{
int a[] = { 2,1,5,7,3,9,0,4,6,8 };
int* p = a;
int temp = 0, falg = 0; // 注意:这里有个拼写错误,应该是flag
int n = sizeof(a) / sizeof(a[0]);
printf("%d\n", n);
for (int i = 0; i < n - 1; i++)
{
int flag = 1; // 每轮开始前假设数组已有序
p = a; // 重置指针到数组开头
for (int j = 0; j < n - 1 - i; j++)
{
if (*p > *(p+1)) // 使用指针比较相邻元素
{
flag = 0; // 发生交换,标记为无序
temp = *p;
*p = *(p + 1);
*(p + 1) = temp;
}
p++; // 指针移动到下一个元素
}
if (flag == 1) // 如果本轮没有发生交换
{
break; // 提前结束排序
}
}
for (int k = 0; k < n; k++)
{
printf("%d ", a[k]);
}
printf("\n");
return 0;
}| 特性 | 方法一 | 方法二 | 方法三 |
|---|---|---|---|
| 代码复杂度 | 简单 | 中等 | 中等 |
| 执行效率 | 稳定o(n²) | 最好o(n) | 稳定o(n²) |
| 内存使用 | 低 | 低 | 低 |
| 适用场景 | 教学演示 | 实际应用 | 指针学习 |
| 优化程度 | 无优化 | 提前终止 | 无优化 |
三种冒泡排序实现各有特色:
虽然冒泡排序在实际应用中效率不高,但作为算法学习的入门课程,它帮助我们理解排序的基本概念和算法优化的重要性。掌握这三种实现方式,能够为学习更复杂的排序算法打下坚实基础。
无论选择哪种实现方式,理解算法背后的思想才是最重要的!
以上就是c++实现冒泡排序的多种方式详解的详细内容,更多关于c++冒泡排序实现的资料请关注代码网其它相关文章!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论