引入
我想大部分编程小白学的第一种排序算法都是冒泡排序吧,你还没弄懂?快来看看!!
源码
void input(int* p, int sz)
{for (int i = 0; i < sz - 1; i++){scanf("%d ", p + i);}
}void bubble_sort(int* p, int sz)
{for (int i = 0; i < sz; i++){int flag = 1;for (int j = 0; j < sz - i - 1; j++){if (p[j] > p[j + 1]){flag = 0;int tmp = p[j];p[j] = p[j + 1];p[j + 1] = tmp;}}if (flag)break;}
}
void print(int *p, int sz)
{for (int i = 0; i < sz; i++){printf("%d ", p[i]);}
}
int main()
{int arr[10] = { 0 };int sz = sizeof(arr) / sizeof(arr[0]);input(arr, sz);bubble_sort(arr, sz);print(arr, sz);return 0;
}
解释
上面的代码我们封装了三个函数,我们需要重点关注的是bubble_sort
代码的核心思想就是,相邻元素之间进行比较,不符合预期就交换顺序,每完成一趟都会使得一个数字到达正确的位置,再通过两层嵌套的循环来达到目的。
我们再看两层循环的嵌套,外层循环决定了循环的躺输,内存循环则决定了元素之间比较的次数
以下是需要明确的点:
- 外层循环的循环条件是元素个数减一,比方说有十个数据要进行排序,九个数据都排到正确的位置,那么剩下的一个一定也处在正确位置
- 内层循环的循环条件是元素个数减去本次循环的趟数再减一,因为每次排完一个元素之后都不需要继续和这个排好的元素进行比较
- 设置
flag
变量,相当于是冒泡排序的一个优化,比方说本身输入的数据就是理想的顺序,那么就只需要一次外层循环来确定顺序是正确的,flag
的值如果没有被改变,那么说明本次循环没有数据之间的交换,那么直接就结束循环
完