选择排序法,着种方法交换数据的次数远小于冒泡排序。
从大到小排序
将数组元素第一个与之后的每一个元素比较,记录最大的元素的下标,在第二层循环中不进行交换只进行比较。
#include <stdio.h>
#include <stdlib.h>
#define N 5
int main(void)
{
int i, j;
int temp, max;
int nums[N]{ 56, 1, 88, 65, 97 };
int k = 0;
for (i = 0; i < N - 1; i++) //先取第0个元素
{
max = i; //记录取的元素的下标,将其假定为最大值。
for (j = i + 1; j <= N; j++) //从所取元素的后一个元素依次遍历
{
if (nums[j] > nums[max]) //如果之后的元素中有比所取元素大的元素
{
max = j; //将最大值元素的下标换为更大的元素的下标
k++; //此时会交换一次数据
}
}
temp = nums[i]; //在第一层循环中交换,
nums[i] = nums[max]; //只做两个数之间的交换,将最大的数摆在最前方
nums[max] = temp; //交换次数比冒泡排序大大减少
}
printf("一共交换了%d次\n", k - 1); //此处k需要减一
printf("排序后的结果是:\n");
for (i = 0; i < N; i++)
{
printf("%d\t", nums[i]);
}
printf("\n");
system("pause");
return 0;
注意
temp = nums[i];
nums[i] = nums[max];
nums[max] = temp;
这一段交换数据的代码应写在最外层的for循环中确保只将最大值和当前元素交换,与冒泡排序相比减少了排序次数和时间。
从小到大排序
#include <stdio.h>
#include <stdlib.h>
#define N 5
int main(void)
{
int i, j;
int temp, min;
int k = 0;
int nums[N]{ 56, 1, 88, 65, 97 };
for (i = 0; i < N - 1; i++)
{
min = i;
for (j = i + 1; j <= N - 1; j++) //注意此处的循环条件, j <= N - 1若 j < N则数组越界
{
if (nums[j] < nums[min])
{
min = j;
k++;
}
}
temp = nums[min];
nums[min] = nums[i];
nums[i] = temp;
}
printf("一共交换了%d次\n", k); //此处k不用减一
printf("排序后的结果是:\n");
for (i = 0; i < 5; i++)
{
printf("%d\t", nums[i]);
}
printf("\n");
system("pause");
return 0;
}
此时因为将最大的数置于最右边,因此交换数组元素的代码也变为
temp = nums[min];
nums[min] = nums[i];
nums[i] = temp;
因此内嵌的for循环条件应变为for(j = i + 1; j < N - 1; j++),以此防止数组越界。