1.冒泡排序法
问题描述
在一个神秘的岛屿上,有一支探险队发现了一批宝藏,这批宝藏是以整数数组的形式存在的。每个宝藏上都标有一个数字,代表了其珍贵程度。然而,由于某种神奇的力量,这批宝藏的顺序被打乱了,探险队需要将宝藏按照珍贵程度进行排序,以便更好地研究和保护它们。作为探险队的一员,肖恩需要设计合适的排序算法来将宝藏按照珍贵程度进行从小到大排序。请你帮帮肖恩。
输入描述
输入第一行包括一个数字 n ,表示宝藏总共有 n 个。
输入的第二行包括 n 个数字,第 i 个数字 a[i] 表示第 i 个宝藏的珍贵程度。
数据保证 1≤n≤1000,1≤a[i]≤1000000 。
输出描述
输出 n 个数字,为对宝藏按照珍贵程度从小到大排序后的数组。
样例输入
5 1 5 9 3 7
#include <bits/stdc++.h>
using namespace std;
const int N = 1000;
int main() {
int a[N];
int n;
cin >> n;
for (int i = 0; i < n; i++)
cin >> a[i];
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (a[j] > a[j + 1]) {
// 交换 a[j] 和 a[j + 1] 的值
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
// 输出排序后的数组
for (int i = 0; i < n; i++)
cout << a[i] << ' ';
cout << '\n';
return 0;
}
代码分析:
冒泡排序中,典型的实现会有两个嵌套的循环结构,一个用于遍历整个序列(外层循环),另一个用于相邻元素的比较和交换(内层循环)。这两个循环协同工作,每一轮外层循环都会确定一个最大的元素的位置,直到整个序列有序。
综合起来,这段代码通过冒泡排序对输入的整数列表进行排序,并输出排序后的结果。冒泡排序算法的时间复杂度较高,是O(n^2),因此在大规模数据集上可能不够高效。
python:
n = int(input())
a = list(map(int, input().split()))
for i in range(0, n-1):
for j in range(0, n-i-1):
if a[j] > a[j+1]:
a[j], a[j+1] = a[j+1], a[j]
print(' '.join(map(str, a)))
代码分析:
for j in range(0, n-i-1):
循环中,使用 j
的目的是遍历待排序的元素,而 n-i-1
是因为每一轮外层循环都会把当前未排序部分的最大元素移动到正确的位置,所以下一轮遍历时就可以少遍历一个已经排序好的元素。
具体地说,range(0, n-i-1)
中的 0
表示起始索引,n-i-1
表示结束索引。在每一轮外层循环中,都会把当前最大的元素冒泡到末尾,所以下一轮就不需要再考虑这个元素,因此内层循环的结束索引是 n-i-1
。
例如,假设 n
为 5,那么外层循环会进行 4 次,分别是第一轮(i=0)、第二轮(i=1)、第三轮(i=2)、第四轮(i=3)。在第一轮中,内层循环遍历的范围是 range(0, 5-0-1)
,即 range(0, 4)
,依次遍历索引 0、1、2、3。
这样设计的目的是确保在每一轮外层循环中,内层循环都不会再访问已经确定顺序的末尾元素。
这种方法可以在一行代码中方便地将列表元素以指定的格式打印出来。如果你有一个整数列表 a
,但是 print(a)
输出的是整个列表,而你希望以空格分隔的形式打印列表的元素,就可以使用这种方式。
-
map(str, a)
: 这一步使用map
函数将列表a
中的每个元素转换为字符串。map(str, a)
的结果是一个可迭代对象,其中包含了a
中每个元素的字符串形式。 -
' '.join(...)
: 这一步使用join
方法将上一步得到的字符串可迭代对象中的每个元素用空格连接起来。' '.join(...)
的结果是一个以空格分隔的单个字符串。 -
print(...)
: 最后,print
函数用于将上一步得到的字符串打印到控制台。