目录
冒泡排序实现功能
- 对无序的整型数组进行排序
- 将整型数组排序排成升序
冒泡排序实现逻辑
要实现冒泡排序首先要确定冒泡排序的趟数,其次再实现每一趟冒泡排序的内容
确定冒泡排序的趟数
冒泡排序的核心思想为:两两相邻的元素进行比较
例如要排序的数组为:int arr[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
arr数组为降序,也就是需要升序的数组的最坏情况
9 8 7 6 5 4 3 2 1 0 —— arr[0] > arr[1],则需要交换两个元素
8 9 7 6 5 4 3 2 1 0 —— arr[1] > arr[2],也需要交换
8 7 9 6 5 4 3 2 1 0
…………
8 7 6 5 4 3 2 1 0 9 —— 此时的元素9就到了最终应该出现的位置
以上的逻辑操作为一趟冒泡排序,一趟冒泡排序搞定了一个元素最终应该停留的位置上
那么10个元素就要进行9趟冒泡排序,因为10个元素中的9个元素都出现在自己该停留的位置上了,那么第10个元素也在自己该停留的位置上。由此可得,n个元素就要进行n-1趟冒泡排序
每一趟冒泡排序的内容
- 当第一个元素大于第二个元素时,就进行交换,否则就比较下一对,以此类推,比较完每一对元素后,至少会有一个元素停留再最终应该出现的位置
- 当10个元素需要排序时,需要比较9对,当9个元素需要排序时,需要比较8对…………
- 由此可见每趟冒泡排序的内容是随着元素逐渐递减的,所以可以通过冒泡排序的趟数来控制每趟冒泡排序的递减
插旗小技巧
可以在每一趟冒泡排序的代码内容中插旗,初始flag赋值为1
每当有元素进行交换,就将flag赋值为0
如果所有元素遍历完后都没有进行交换,那么说明此时的数组已经是升序状态,那么也没有将flag赋值为0
每次循环完后判断flag是否为1,为1时就停止排序,跳出循环
话不多说,上代码
#include<stdio.h>
void bubble_sort(int* str, int sz)
{
//sz个元素,则进行sz-1趟冒泡排序
for (int i = 0; i < sz - 1; i++)
{
//插旗
int flag = 1;
//每当交换完一个元素时,交换趟数就应该递减,所以可以由i来控制
for (int j = 0; j < sz - 1 - i; j++)
{
if (*(str + j) > *(str + j + 1)) //判断每一对
{
//交换前,让flag失效
flag = 0;
//交换
int tmp = *(str + j);
*(str + j) = *(str + j + 1);
*(str + j + 1) = tmp;
}
}
//判断flag是否为真,为真则表明没有进入循环,
//也就表明没有交换,同样也就表明此时的数组已经为升序
if (flag)
return ;
}
}
int main()
{
//创建数组
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
//数组元素个数
int sz = sizeof(arr) / sizeof(arr[0]);
//冒泡排序
bubble_sort(arr, sz);
//打印验证
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
see you