如果我们有 {9 ,8,7,6,5}的数组需要冒泡升序排序
第一步我们先构思画图 画图进行冒泡排序
第二步:如图 如果要进行 数组冒泡排序的话 不难发现 趟数和数组是有关系的,例如: 数组个数5-1趟 等于 ④ 趟? ? ?n(数组个数)? ? n-1(趟)?
那么我们就可以得到如下代码计算趟数:
int arr[]={9,8,7,6,5};
int sz = sizeof(arr)/sizeof(arr[]);//计算元素个数
for(int i =0;i<sz-1;i++)//确定趟数 //sz-1===需要数组个数5-1趟 等于 ④ 趟
{
}
第三步我们知道了趟数后 接下来就要来研究 每一趟在干嘛
if arr[0]>arr[0+1] 如果第一个元素大于了? ?第二个元素的话 那么应该进行互换 如果想把接下来的每一个元素都按照条件互换则需要用到for循环
得到以下代码:
//int arr[]={9,8,7,6,5};
for (int j = 0; j<暂时不写条件我们来后面分析; j++)
{
if (arr[j]>arr[j + 1]) //如果元素大于了 第二个元素的话 进行互换
{
int tep = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tep;
}
}
第四步分析//(j<的条件):参考最前面第一个图? 不难发现? 每一趟里面交换的次数 是 数组个数-本次趟速-1;? 一开始 趟数 i=0? &&i<4? ?所以第一趟内部循环{5-0-1} 次? ?第二趟内部循环{5-1-1} 次??第三趟内部循环{5-2-1} 次? ? ?第四趟内部循环{5-3-1} 次? ? ? ?
得到以下j<条件
for (int j = 0; j < sz-i-1 ; j++)
综上所述:得到完整代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void abl(int arr[], int sz)
{
for (int i = 0; i < sz-1; i++)
{
for (int j = 0; j < sz-1-i ; j++)
{
if (arr[j]>arr[j+1])
{
int tap = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tap;
}
}
}
}
int main()
{
int arr[] = { 9, 8, 7, 6,5};
int sz = sizeof(arr) / sizeof(arr[0]);
printf("数组个数是 %d \n", sz);
abl(arr, sz);
printf("冒泡升序排序后:");
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
运行结果:
|