冒泡排序
代码
#include<iostream>
using namespace std;
void swap(int &m,int &n){
int temp;
temp = m;
m = n;
n = temp;
}
int main(){
int n;
cin >> n;
int a[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])
swap(a[j],a[j+1]);
for(int i = 0; i < n; i++)
cout << a[i] << " ";
return 0;
}
分析
-
算法的大致行为是通过两层循环,从头到尾,每两个元素两两比较,如果顺序相反,两个元素就交换,然后再往后看,最后效果上呈现为数组从尾部开始,依次往前顺序依次排好,最后数组头部再排好,整个过程就完成了。
-
i<n-1
表示i
最大能为n-2
,j<n-i-1
表示j
最大只能为n-i-2
。- 其中
i
可以理解为尾部已经排好顺序的元素个数,j
则是在头部未排好序的元素中遍历。 - 当
i=0
时,表示已有0
个元素已排好序,即当前为第一轮排序。j
最大能为n-2
,j+1
则为n-1
,逻辑地址则为n
,所以能遍历到最后一个元素。 - 当
i=n-2
时,表示已有n-2
个元素已排好序,还剩两个元素未排序,即当前为最后一轮排序。j
最大能为0
,j+1
则为1
,逻辑地址则为2
,则j
和j+1
分别表示第一个和第二个元素,所以最后两个元素也可以进行比较。
- 其中
-
如果
a[j]>a[j+1]
,则两个元素进行交换,j++
之后的a[j]
就是之前二者之间较大的那个数,再将其与其后的元素进行比较,依次往后,就会让最大的数出现在最后。如果a[j]<a[j+1]
,则两个元素不做任何操作,j++
之后,a[j]
依然是之前二者之间较大的数,同上。 -
时间复杂度 T(n) = O(n2),如无特殊时间要求,此方法还是比较好理解的。
以上内容如有错误之处,还请大家指正!以求进步,谢谢!