冒泡排序
- 大概的思想
一趟冒泡排序之后,最大的数在最后;第二趟冒泡之后,次大的数在倒数第二位。
其中一个优化措施是 用一个变量flag标识这一趟冒泡中是否有过交换,如果没有的话,说明数组已经有序了。
- 代码
#include <stdio.h>
#define ElementType long
#define maxn 100001
ElementType A[maxn];
void Swap(ElementType A[], int i, int j);
void Bubble_sort(ElementType A[],int N);
int main(int argc, const char * argv[]) {
int N;
scanf("%d",&N);
for(int i=0; i<N; i++){
scanf("%ld",&A[i]);
}
Bubble_sort(A, N);
printf("%ld",A[0]);
for(int i=1; i<N; i++){
printf(" %ld",A[i]);
}
printf("\n");
return 0;
}
void Swap(ElementType A[], int i, int j){
ElementType tmp = A[i];
A[i] = A[j];
A[j] = tmp;
}
void Bubble_sort(ElementType A[],int N){
int flag,i,j;
for(i=N-2; i>=0; i--){
flag = 0;
for(j=0; j<=i; j++){
if(A[j] > A[j+1]){
Swap(A, j, j+1);
flag = 1; //标识发生了交换
}
}
if(flag == 0) break;//全程无交换,说明前面已经全部有序了,不需要再比较
}
}
- 运行结果
- 小结
最坏时间复杂度是O(N^2),如果数组基本有序,那么经过若干趟排序之后数组就可能是有序的,所以可能复杂度是O(N),所以通过了测试点8
评价:交换排序,简单排序,最坏时间复杂度是O(N^2),在数组基本有序的情况下时间复杂度可能是O(N)。空间复杂度O&#x