一、对数组进行排序,采用函数。
#include <stdio.h>
void bubble_sort(int arr[],int sz)
{
//确定冒泡排序的趟数
int i = 0 ;
for ( i = 0; i < sz-1; i++)
{
//每一趟冒泡排序
int j= 0;
for ( j = 0; j < sz-1-i; j++)
//循环递减,每次少i次。
{
if(arr[j]>arr[j+1])
{
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
//采用中间函数进行位置调换。
}
//i--; 效率低。
}
}
}
int main()
{
int arr[]={9,8,7,6,5,4,3,2,1,0};
int i =0;
int sz = sizeof(arr)/sizeof(arr[0]);
//对arr进行升序排列
bubble_sort(arr,sz); //冒泡排序函数
for ( i = 0; i <sz ; i++)
{
printf("%d ",arr[i]);
}
return 0;
}
1,冒泡排序法是通过将一个最大或者最小的数通过在一组数中进行一次次的比较与交换将该数浮到最右边或者最左边的排序方法,通过将两个相邻的元素进行比较,将较大的值交换到右面(左面)。
2,冒泡排序的设计原理是,对于n个数对其进行排序,总共要进行n-1次排序,每次排序的次数为n-i次,因为每循环一次,内层所需要比较的次数减一,我们可以使用双重循环的方式,外层循环用来控制循环的趟数,内层循环用来控制每一次循环所需要比较的次数。
3,中间可以定义一个中间变量tmp用来实现两个数的交换。
二、对输入的任意数组进行排列
#include <stdio.h>
void bubble_sort(int arr[],int sz)
{
//确定冒泡排序的趟数
int i = 0 ;
for ( i = 0; i < sz-1; i++)
{
//每一趟冒泡排序
int j= 0;
for ( j = 0; j < sz-1-i; j++)
//循环递减,每次少i次。
{
if(arr[j]>arr[j+1])
{
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
//采用中间函数进行位置调换。
}
//i--; 效率低。
}
}
}
int main()
{
int m = 0;
int arr[8]={0};
for ( m = 0; m < 8; m++)
{
scanf("%d ",&arr[m]);
}
//int arr[]={9,8,7,6,5,4,3,2,1,0};
int sz = sizeof(arr)/sizeof(arr[0]);
int j =0;
//对arr进行升序排列
bubble_sort(arr,sz); //冒泡排序函数
for ( j = 0; j <sz ; j++)
{
printf("%d ",arr[j]);
}
return 0;
}
三、增加flag参数进行判断,如果本趟已经有序则跳出循环。
#include <stdio.h>
void bubble_sort(int arr[],int sz)
{
//确定冒泡排序的趟数
int i = 0 ;
for ( i = 0; i < sz-1; i++)
{
int flag = 1;//假设这一趟已经有序
//每一趟冒泡排序
int j= 0;
for ( j = 0; j < sz-1-i; j++)
//循环递减,每次少i次。
{
if(arr[j]>arr[j+1])
{
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
//采用中间函数进行位置调换。
flag = 0; //这一趟其实不完全有序
}
//i--; 效率低。
}
if (flag==1)
{
break;
}
}
}
int main()
{
int arr[]={9,8,7,6,5,4,3,2,1,0};
int i =0;
int sz = sizeof(arr)/sizeof(arr[0]);
//对arr进行升序排列
bubble_sort(arr,sz); //冒泡排序函数
for ( i = 0; i <sz ; i++)
{
printf("%d ",arr[i]);
}
return 0;
}