6-1 使用函数的选择法排序

本题要求实现一个用选择法对整数数组进行简单排序的函数。

函数接口定义:

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次的交换中移动到最末端

如果有问题欢迎指出

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值