1.交换法排序
图解:
分析:
首先进行第一轮,假设有n个数,将第一个数和后面所有的数分别比较,如后面的数大,则交换这两个数的位置,共进行(n-1)次比较;这次比较后,就求出了最大值放在最前面。
然后进行第二次比较,从第二个数比较,方法和第一次一样。
到最后一次,剩下的最后一个数自然就为最小数。
代码展示:
#include<stdio.h>
int main()
{
int arr[5] = { 34,33,38,37,21 };
for (int i = 0; i < 5 - 1; i++)
{
for (int j = i + 1; j < 5; j++)
{
if (arr[j] > arr[i])
{
int tmp = arr[j];
arr[j] = arr[i];
arr[i] = tmp;
}
}
}
for (int i = 0; i < 5; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
2.选择法排序
图示:
分析:
在每一轮比较中,记住数组中最大数的下标j,arr【j】和每遍循环的arr【i】进行比较,如果大于,就交换,如果小于,就不交换。
也就是说,每次比较只用和剩下余数中最大的数比较,不用再遍历数组进行比较。
int main()
{
int arr[5] = { 84,83,88,87,61 };
int k = 0;
for (int i = 0; i < 5 - 1; i++)
{
k = i;
for (int j = i + 1; j < 5; j++)
{
if (arr[j] > arr[k])
{
k = j;//记录最大数的下标
}
}
if (k != i)//若最大数的下标不在下标位置i,则交换
{
int tmp = arr[k];
arr[k] = arr[i];
arr[i] = tmp;
}
}
for (int i = 0; i < 5; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
over~