任务描述
要求实现简单选择排序的功能。
相关知识
简单选择排序算法思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。
以长度为n=10
的序列(46 74 53 14 26 38 86 65 27 34)
的选择排序过程做示范:
第1
趟:在10
个数中选出最小值后,将最小值和第1
个数组元素交换,则数组元素为(14 74 53 46 26 38 86 65 27 34)
; 第2
趟:在剩下的9
个数中选出最小值后,将最小值和第2
个数组元素交换,则数组元素为(14 26 53 46 74 38 86 65 27 34)
; 第3
趟:在剩下的8
个数中选出最小值后,将最小值和第3
个数组元素交换,则数组元素为(14 26 27 46 74 38 86 65 53 34)
; ……
第9
趟:在剩下的2
个数中选出最小值后,将最小值和第9
个数组元素交换,则数组元素为(14 26 27 34 38 46 53 65 74 86)
;
共执行9
趟操作,可将有n=10
个元素的数组排成有序序列。
编程要求
对数组中的元素实现简单选择排序,并输出每一次排序后的结果。具体请参见后续测试样例。
测试说明
测试输入:10
88 84 23 85 32 34 80 52 91 77
预期输出:23 84 88 85 32 34 80 52 91 77
23 32 88 85 84 34 80 52 91 77
23 32 34 85 84 88 80 52 91 77
23 32 34 52 84 88 80 85 91 77
23 32 34 52 77 88 80 85 91 84
23 32 34 52 77 80 88 85 91 84
23 32 34 52 77 80 84 85 91 88
23 32 34 52 77 80 84 85 91 88
23 32 34 52 77 80 84 85 88 91
提示:
如果有10
个整数,要求输出每趟选择排序共9
趟的结果。
#include <stdio.h>
#define N 100
int main ()
{
int i,j,k,n;
int a[N];
scanf("%d",&n);
for(i=0; i<n; i++)
scanf("%d",&a[i]);
for(i=0; i<n-1; i++)
{
//a[i],a[i+1],...,a[n-1]
k = i; //指向最小数
for(j=i+1; j<n; j++)
if(a[j]<a[k])
k = j;
//交换a[k]和a[i]
if(k!=i)
{
int temp = a[k];
a[k] = a[i];
a[i] = temp;
}
//输出
for(j=0; j<n; j++)
printf("%d ",a[j]);
printf("\n");
}
return 0;
}