一.冒泡排序
思路
1.冒泡排序如同鱼儿吐泡泡一样,从水底冒泡泡由小变大的过程。同煮热水一样,水泡从壶底冒出来从小到大的过程。
2.冒泡排序的核心是两两交换,对同一数组中的数据进行两两交换,一次循环的两两交换可以求出一个最大值,而求出最大值后要让其长度减一。
注意:两两交换求最值,可以验证!
如果出一个题目求最值,可以用两两交换得。
代码效果
#include <stdio.h>
int main()
{
//冒泡排序法
int a[10] = {1, 10, 4, 11, 34, 2, 12, 45, 6, 3};
int i,j,tmp;
for (int i = 0; i <= 9; i++)
{
for (int j = 0; j <= 9 - i; j++)
{
if (a[j] > a[j + 1])
{
int tmp = a[j];
a[j] = a[j + 1];
a[j + 1] = tmp;
}
}
}
for (int i = 0; i <= 9; i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
二.选择排序
思路
如果数组是从小到大排序,那么第一个数就是最小值,那么我们如何使第一个数的值最小呢?通过比较法,遍历比较,即对同一个位置进行遍历的比较,但是选择排序是对下标进行赋值,并没有取交换数值,这种方式好处在于减少了交换次数,提高了代码的执行效率。相比于打擂台排序代码更加的简洁。
注意:选择排序的核心在于下标进行赋值而不是下标进行交换.
(例如:如果 a[min] > a[n] 则 min = n 下标进行交换)
代码效果
#include <stdio.h>
int main()
{
// 选择排序法 选择排序是换下标 而打擂台排序是换数据 区别
int a[10] = {1, 10, 4, 11, 34, 2, 12, 45, 6, 3};
int min, tmp;
for (int n = 0; n <= 9; n++)
{
printf("%d ", a[n]);
}
printf("\n");
for (int n = 0; n <= 9; n++)
{
min = n;
for (int j = n + 1; j <= 9; j++)
{
if (a[min] > a[j])
{
min = j;
// printf("%d ", min);
}
}
if (min != n)
{
tmp = a[min];
a[min] = a[n];
a[n] = tmp;
}
}
for (int n = 0; n <= 9; n++)
{
printf("%d ", a[n]);
}
printf("\n");
}