冒泡排序
1.概念
从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。
小的数据往上升,像小气泡一样一点一点地冒出来,而大的数据则往下降(降序);升序则反过来。
此时这串数字已经排好,之后的循环也不会交换值。
就像下图一样,不停循环,直到数字1排好。
2.代码
#include<stdio.h>
main()
{
int i, j, a[100], t;
int n;
scanf("%d",&n);
printf("请输入要排序的元素:");
for (i = 0; i < n ;i++)
{
scanf("%d",&a[i]);
}
for (i = 0; i < n-1; i++)
{
for (j = 0; j < n - i -1; j++)
{
if (a[j] > a[j + 1])
{
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
printf("排序之后为:");
for (j = 0; j < n; j++)
printf("%d ", a[j]);
}
以下是程序运行时每一次循环的结果:
比较交换
1.概念
第一轮用a[0]依次与a[1],a[2],....进行比较,若次序不对就交换,否则不交换,本轮结束后,a[0]就是最小数。\n 第二轮用a[1]与依次与a[2],a[3],.....交换,处理方法与第一轮相同。重复上述过程,至第N-1轮(N为排序的个数)。采用二重循环,外循环变量i从0循环到N-2,共循环N-1次;内循环变量j从i+1开始循环到N-1。
2.代码
#include<stdio.h>
main()
{
int n;
int i, j, t, a[100];
scanf("%d",&n);
printf("请输入要排序的元素:");
for (j = 0; j < n; j++)
scanf("%d",&a[j]);
for (i = 0; i < n-1; i++)
{
for (j = i + 1; j < n; j++)
{
if (a[i] > a[j])
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
for (j = 0; j < n; j++)
printf("%d ", a[j]);
}
与冒泡排序的代码相似,都采用双层循环,但比较排序是让一个数字与剩余所有数字比较,易理解,故在此不再赘述。
可通过对照冒泡排序的程序运行图理解比较交换法!