学习目标:
了解冒泡排序法的排序过程并用代码实现数组从小到大进行排列
冒泡排序过程:
例如一串数字:9 8 7 6 5 4 3 2 1 0,一共有十个数字,两两进行比较,如果前一个数大于后一个数则位置对调,9要从第一位调到最后一位需要进行9次对调,第一趟结束后,9调到最后一个位置,然后进行第二趟冒泡排序,依次进行下去,当到第九次冒泡时顺序为1 0 2 3 4 5 6 7 8 9,当第九趟结束后顺序为0 1 2 3 4 5 6 7 8 9,这样就不需要进行第十趟排序了,对于有序数列,有i个数字就要进行i-1趟排列,现在,我们知道冒泡排序的排序过程了,接下来就需要用代码实现冒泡排序了。
代码实现:
现在给一个整型数组int arr[10]={ 9,8,7,6,5,4,3,2,1,0 },现在int main()主函数体中把数组里有多少个数算出来,再用一个整型变量存储,int sz = sizeof(arr) / sizeof(arr[0]),然后创建一个bubble_sort函数,在bubble_sort函数里实现冒泡排序,先确定冒泡排序的趟数,再进行每一趟的冒泡排序,这里需要两个for循环进行实现。整体代码如下:
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++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j + 1];
arr[j+1] = arr[j];
arr[j] = tmp;
}
}
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]);
bubble_sort(arr,sz);
for (i = 0; i < sz; i++)
{
printf("%d\n",arr[i]);
}
return 0;
}
以上代码虽然可以实现数组的冒泡排序,但却有个弊端,那就是如果给你一个数组9 0 1 2 3 4 5 6 7 8,这个数组只需要一趟就可以了,但这个代码执行一趟后还会接着执行,直至完成第九趟之后才会停止,这个非常浪费时间,所以我们可以在进入第一趟时假设他已经有序,定义一个整型变量flag,赋给他1,代表已经有序,然后再进行排序,如果有两个数字需要调换顺序,则要进入第二个for循环进行调换位置,在循环最后把flag赋值为0,代表有数字调换顺序,本趟数组不是有序的,然后再进行第二趟冒泡排序,在排序前再次假设此时他已经有序,如果这一趟没有进入第二个for循环,则说明数组已经有序,写一个判断语句if,如果flag==1则break跳出循环,这样就不需要再往下执行。改变代码如下:
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++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j + 1];
arr[j+1] = arr[j];
arr[j] = tmp;
flag = 0;//本趟排序的数据其实不完全有序
}
}
if (flag == 1)
break;
}
}