冒泡排序
算法思想
冒泡排序的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。其过程如下:
在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。冒泡排序流程至此第一趟结束,将最大的数放到了最后。
第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。
如此下去,重复以上过程,直至最终完成排序。
由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。
源代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 100
int array[MAX];
void BubbleSort(int n)//冒泡排序
{
int i,j,temp;
for(j=0;j<n;j++)
{
for(i=1;i<n;i++)
{
if(array[i]<array[i-1])
{
temp=array[i-1];
array[i-1]=array[i];
array[i]=temp;
}
}
}
printf("排序结果为:\n");
i=0;
while(i<n)
{
printf("%d ",array[i]);
i++;
}
printf("\n");
}
void main()
{
int i,count=0;
char flag;
printf("请输入要排序的数字\n");
for(i=0;flag!='\n';i++)
{
scanf("%d",&array[i]);
flag=getchar();
count++;
}
BubbleSort(count);
}
算法分析
1.流程图
2.复杂度分析
若记录序列的初始状态为"正序",则冒泡排序过程只需进行一趟排序,在排序过程中只需进行n-1次比较,且不移动记录;反之,若记录序列的初始状态为"逆序",则需进行n(n-1)/2次比较和记录移动。因此冒泡排序总的时间复杂度为O(n*n)。
3.优缺点
优点:比较简单,空间复杂度较低,是稳定的;
缺点:时间复杂度太高,效率慢;