本题要求实现一个用选择法对整数数组进行简单排序的函数。
函数接口定义:
void sort( int a[], int n );
其中a
是待排序的数组,n
是数组a
中元素的个数。该函数用选择法将数组a
中的元素按升序排列,结果仍然在数组a
中。
裁判测试程序样例:
#include <stdio.h>
#define MAXN 10
void sort( int a[], int n );
int main()
{
int i, n;
int a[MAXN];
scanf("%d", &n);
for( i=0; i<n; i++ )
scanf("%d", &a[i]);
sort(a, n);
printf("After sorted the array is:");
for( i = 0; i < n; i++ )
printf(" %d", a[i]);
printf("\n");
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
4
5 1 7 6
输出样例:
After sorted the array is: 1 5 6 7
此题代码实现十分简单,以下是我的思路:
void sort( int a[], int n ){
for(int i=0;i<n-1;i++){
int min=i;//最小元素位置
for(int j=i+1;j<n;j++){
if(a[min]>a[j]){
min=j;//重定位最小元素位置
}
}
if(min!=i){
int temp=a[i];
a[i]=a[min];
a[min]=temp;
}
}
}
首先,设置第一个for循环,从零开始到n-1结束,因为你循环到n-1时最大元素就将排在最末尾的位置也就是a[n]这个位置,我将每层循环的位置设置为最小初始位置(int min=i),接着用第二个for循环从这个位置开始遍历,依次比较a[min]和a[j]的值,如果遇到了a[min]大于a[j],也就是a[min]不是最小值的情况,就将这个位置设为新的最小位置,直至遍历完全部数组。
接着在大循环中设置一个if判断语句,如果最小初始位置发生改变,就将此位置与新的最小位置的值进行调换(注意,这里调换的是数组值进行调换,并不是真的位置),下面用题目的例子来举例以便大家理解:
[5, 1, 7, 6]
第一轮:min初始值为i=0,a[min]=5
选择最小元素,即 a[j=1]=1,与a[min]=5交换位置
数组变为:[1, 5, 7, 6]
第二轮:min初始值为i=1,a[min]=5
在余下的数组值 7,6 中没有找到比5更小的值,此时min的位置不变与i的位置一样,不触发if语句,不进行交换
数组保持不变:[1, 5, 7, 6]
第三轮:min初始值为i=2,a[min]=7
选择最小元素,即 a[j=3]=6,与a[min]=7 交换位置
数组变为:[1, 5, 6, 7]
到这里循环就结束了,因为最大的数已经在第n-1次的交换中移动到最末端
如果有问题欢迎指出