冒泡排序:
简单点说,就是一组数据,第0个和第1个比较,大的放后面,接着第1个和第2个比较,第2个和第3个比较……依次下去,比出一个最大的取出来;剩下的重复上个动作,每次都比较出一个最大的。如果有n个数据的话,第一次比较n-1次,第二次n-2次……一共需要重复n-1次。
可以利用代码来实现:
#include<stdio.h>
void main()
{
int arr[]={45,5,68,98,41,64,78}; //定义一个数组
int len = sizeof(arr) / sizeof(arr[0]); //表示数组的元素个数
int i,j,k;
for(i = 0;i < len - 1;i++) //外层循环
{
for(j = 0;j < len - i - 1;j++) //内层循环
{
if(arr[j] > arr[j+1]) //交换
{
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
for(k = 0;k < len;k++) //输出
{
printf("%d ",arr[k]);
}
}
冒泡排序的优化,在计算机执行冒泡排序的循环时,考虑到时间复杂度的问题,如果在外循环未循环完之前,数据已经有序,则就不用使循环继续执行下去,需要立一个flag,程序如下
void main()
{
int arr[]={45,5,68,98,41,64,78}; //定义一个数组
int len = sizeof(arr) / sizeof(arr[0]); //表示数组的元素个数
int i,j,k;
int flag = 0; //立一个flag
for(i = 0;i < len - 1;i++) //外层循环
{
for(j = 0;j < len - i - 1;j++) //内层循环
{
if(arr[j] > arr[j+1]) //交换
{
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
flag = 1; //如果发生交换,flag变为1
}
}
if(flag==0) //如果未发生交换,表示已经有序,直接break
{
break;
}
}
for(k = 0;k < len;k++) //输出
{
printf("%d ",arr[k]);
}
}
希望对博友们有帮助。