冒泡排序的C实现
原理分析
数组分为两部分,左半部分为已排序部分,右半部分为未排序部分。
实现思路
外层循环:i指向未排序部分的第一个元素,随着一次排序完毕后,i++;相当于未排序与排序的边界。
内层循环:j指向未排序部分的最后一个元素,从A末尾N-1开始,减少到i+1结束。每一次循环都与前一个元素相比较,如果前面的小,则交换。
实现代码
#include<stdio.h>
//打印数组
void trace(int A[],int N){
int i;
for(i = 0;i < N;i++){
if(i > 0)printf(" ");
printf("%d",A[i]);
}
printf("\n");
}
//交换两者
void Swap(int *a,int *b){
int temp = *a;
*a = *b;
*b = temp;
}
void bubbleSort(int A[],int n){
bool flag = 1;
for(int i = 0;flag;i++){
flag = 0;
for(int j = n-1;j >= i+1;j--){
if(A[j] < A[j-1]){
Swap(&A[j],&A[j-1]);
trace(A,n);
flag = 1;
}
}
}
}
int main(){
int n,i;
int A[100];
scanf("%d",&n);
for(i = 0;i<=n;i++)scanf("%d",&A[i]);
trace(A,n);
bubbleSort(A,n);
return 0;
}
时间复杂度分析
假设数据长度为N,冒泡排序对于未排序部分的相邻元素进行(N-1)+(N-2)…+1=(N²-N)/2次比较,算法的复杂度量级为O(N²)。