冒泡排序
一、概念
基础概念:每次都把当前元素与下一元素作比较,如果当前元素比下一元素的值大(小)的话,就交换它们的位置,一直循环重复,直到数组有序。 这个过程中,越大(小)的数,就会越早到达数组的最末尾,并保持不动。 然后是第二大的数…第三大的数…过程就像气泡往上冒一样。
二、代码及过程
#include <stdio.h>
void foo(int *a, int n){
int temp,i,j;
for(i = 0; i < n ; i++){
printf("\n第%d趟排序:",i+1);
/** 这里n-i-1是因为,每经过一次遍历,最末尾就能确定一个当前剩余元素中的“最大值”
这个最大值在下次遍历中,无需再次进行比较 **/
for(j = 0; j < n-i-1; j++){
if(a[j] > a[j+1]){ // 当前元素大于下一元素,交换位置
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
printf("%3d",a[j]);
}
}
// 输出最后排序好的数组
for(i = 0; i < n ; i++){
printf("%3d",a[i]);
}
}
void main(){
int a[] = {5,10,3,1,6,12,2};
int n = sizeof(a) / sizeof(a[0]);
foo(a,n);
printf("\n");
}
三、复杂度
时间复杂度: O(n²)
空间复杂度: O(1)