目标效果:
源码:
#include <stdio.h>
void print_out(int a[],int n);
void bubble_sort(int a[],int n);
int main()
{
int a[]={82,47,29,74,91,53,82,62,98,51};
printf("起泡排序\n");
printf("排序前:\n");
printResult(a,10);
//排序方法
bubbleSort(a,10);
printf("排序后:\n");
printResult(a,10);
}
//排序方法
void bubbleSort(int a[],int n)
{
int i,j,flag; //flag=1的代表未完成,还需要继续排序
for(i=0;i<n;i++)
{
flag=0;
for(j=0;j<n-i-1;j++)
{
if(a[j+1]<a[j])
{
flag=1;
int temp;
temp = a[j+1];
a[j+1]=a[j];
a[j]=temp;
}
}
if(flag==0) //flag作为开关变量,如果在某一次排序中已经有序,但是for循环i变量并没有停止自加,这是需要使用开关变量
break;
}
}
void printResult(int a[],int n)
{
int i;
for(i=0; i<n; i++)
printf(" %d",a[i]);
printf("\n");
}
在这个方法中,如果不使用开关变量flag,也可以遍历,但是当I未遍历完却序列已经有序时,则不需要再继续遍历,当序列很大时,开关变量就很重要了。所以交换一次开关变量都改变值,j每次开始循环判断一下,如过上一次循环开关变量没有变,则break。如这个例子,使用开关变量可减少三次遍历。