一.什么是冒泡排序
冒泡排序是(相邻比序法)是一种简单的交换类排序方法,它是通过对相邻的数据元素进行交换,逐步将待排序序列变成有序序列的过程。
二.算法思想
数组由“待排序部分”(前半部分)和“已排序部分”(后半部分)组成。在处理开始之前,“已排序部分”为空,“待排序部分”则是整个数组。
反复扫描待排序序列,在扫描过程顺次比较相邻的两个元素的大小,若与排序顺序相反就交换位置。
以升序排序为列:共有n个数据,那么就需要进行n-1趟排序。
在第一趟冒泡排序中,不断地将相邻两个数据,并将大的数字不断向后移动,最后,毕然最大的数据放在待排序的末尾,这时的数据便归属于已排序部分。(需比较n-1次)
然后进行第二趟排序:对前n-1个待排序进行与第一趟同样的操作,其结果是使次大的数据被放在n-1的位置上。这是便有2个数据在已排序部分。(需比较n-2次(n-1-1))
如此反复,每一趟排序都会将一个数据排到正确位置,直到剩下最小的数字。最终所有的都归属在“已排序部分”的时候,排序结束。
例子:19 80 77 11
- 19 77 80 (交换) 11
- 19 77 **11 80 **(交换)
//第一趟排序结束,最大80被移到最后,比较了3次(19与80,是大到小,所以不交换,80与77,是逆序,交换,最后80与11,交换) - 19 11 77 80
//第二趟排序结束,次大数77被排好, - 11 19 77 80
//第三趟排序结束,第三大数19被排好,整个排列已有序
以上4个数排序,共进行3趟。
三.代码
void BubbleSort(int *array,int n)
{
int i,j;
int t=0;
for(j=0;j<n-1;j++)
{
for(i=0;i<n-j-1;i++)
{
if(array[i]>array[i+1])
{
t=array[i];
array[i]=array[i+1];
array[i+1]=t;
}
}
}
for(i=0;i<n;i++)
{
printf("%d ",array[i]);
}
}
改进后:若在某一趟冒泡排序过程中,没有发现一个逆序(不需要交换),则可直接结束整个排序过程,因为此时说明序列已经有序了。这样便可以优化代码,提高代码运行效率。
#include<stdio.h>
void BubbleSort(int *array,int n)
{
int i,j;
int flag=1;
int t=0;
for(j=0;j<n-1;j++)
{ flag=0;//记录该趟冒泡排序是否进行交换
for(i=0;i<n-j-1;i++)
{
if(array[i]>array[i+1])
{
t=array[i];
array[i]=array[i+1];
array[i+1]=t;
flag=1;
}
if(flag==0)
break;
}
}
for(i=0;i<n;i++)
{
printf("%d ",array[i]);
}
}
int main()
{
int a[5]={19,0,1,2,6};
BubbleSort(a,5);
return 0;
}
运行结果:
时间复杂度:O(N^2), 空间复杂度:0(1);