选择法排序-排序过程

7-3 选择法排序-排序过程
分数 10

全屏浏览题目
作者 bxh
单位 中国民用航空飞行学院
本题要求将给定的n个整数使用选择法进行从大到小的排序,要求输出每一趟排序后的结果。

输入格式:
输入在一行中给出一个不超过10的正整数n。第二行给出n个整数,其间以空格分隔。

输出格式:
按照“输出样例”中给出的格式输出每一趟排序后的结果。注:输出格式中标点符号为英文。

输入样例:
5
5 1 7 -2 6
输出样例:
第1趟排序的结果:7 1 5 -2 6
第2趟排序的结果:7 6 5 -2 1
第3趟排序的结果:7 6 5 -2 1
第4趟排序的结果:7 6 5 1 -2
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB


#include <stdio.h>

void selectionSort(int arr[], int n);

int main()
{
    int n, i;
    scanf("%d", &n);
    int arr[n];
    for (i=0; i<n; i++)
        scanf("%d", &arr[i]);  //输入n个整数
    selectionSort(arr, n);  //进行选择排序
    return 0;
}

void selectionSort(int arr[], int n)
{
    int i, j, max, temp;
    for (i=0; i<n-1; i++)  //循环n-1次,每次找到一个最大值
    {
        max = i;  //设第i个元素为最大值
        for (j=i+1; j<n; j++)  //遍历i+1到n-1的元素
        {
            if (arr[j] > arr[max])  //如果找到一个更大的元素
                max = j;  //记下它的位置
        }
        if (max != i)  //如果最大值不是第i个元素
        {
            temp = arr[i];  //交换最大值和第i个元素
            arr[i] = arr[max];
            arr[max] = temp;
        }
        printf("第%d趟排序的结果:", i+1);  //输出每一趟排序后的结果
        for (j=0; j<n; j++)
            printf("%d ", arr[j]);
        printf("\n");
    }
}

希望对你有所帮助


c
#include <stdio.h>

int main() {
    int n;
    scanf("%d", &n);
    
    int arr[n];
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }
    
    for (int i = 0; i < n - 1; i++) {
        int maxIndex = i;
        for (int j = i + 1; j < n; j++) {
            if (arr[j] > arr[maxIndex]) {
                maxIndex = j;
            }
        }
        
        int temp = arr[i];
        arr[i] = arr[maxIndex];
        arr[maxIndex] = temp;
        
        printf("第%d趟排序的结果:", i + 1);
        for (int k = 0; k < n; k++) {
            printf("%d ", arr[k]);
        } 
        printf("\n");
    }
}

选择法排序,就是每次从待排序数据中选一个最大的数,与待排序数据的第一个进行交换。
5 1 7 -2 6
第1趟排序:找到7,与5交换,结果是:7 1 5 -2 6
第2趟排序:从第2个开始,找到6, 与1交换,结果是:7 6 5 -2 1
第3趟排序:从第3个开始,找到5,自己交换,结果不变:7 6 5 -2 1
第4趟排序:从第4个开始,找到1, 与-2交换,结果是:7 6 5 1 -2
剩最后一个,结束。
代码如下:

#include <stdio.h>

int main() {
    int arr[5] = {5, 1, 7, -2, 6};
    int len = 5;

    for (int i = 0; i < len; i++){
        for (int j = i + 1; j < len; j++){
            if (arr[i] < arr[j]){
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }

    for (int i = 0; i < len; i++){
        printf("%d ", arr[i]);
    }
}
#include <stdio.h>

int main() {
    int n;
    scanf("%d", &n);  // 输入整数数量
    
    int nums[n];
    for (int i = 0; i < n; i++) {
        scanf("%d", &nums[i]);  // 输入整数
    }
    
    for (int i = 0; i < n; i++) {  // 进行n趟排序
        int max_index = i;  // 初始化最大数的索引为i
        for (int j = i + 1; j < n; j++) {  // 找出[i+1, n)区间内的最大值
            if (nums[j] > nums[max_index]) {
                max_index = j;  // 更新最大数的索引
            }
        }
        int tmp = nums[i];
        nums[i] = nums[max_index];
        nums[max_index] = tmp;  // 交换最大数和i位置的数
        
        printf("第%d趟排序的结果:", i + 1);
        for (int j = 0; j < n; j++) {
            printf(" %d", nums[j]);  // 输出这趟排序后的结果
        }
        printf("\n");
    }  
}

以输入样例为例,程序输出结果为:
第1趟排序的结果: 7 1 5 -2 6
第2趟排序的结果: 7 6 5 -2 1
第3趟排序的结果: 7 6 5 -2 1
第4趟排序的结果: 7 6 5 1 -2

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7582727
  • 除此之外, 这篇博客: C语言实现反序输出、分解质因数、回文数判断、斐波那契数列、素数判断、零钱换整、求兔子总数中的 3. 找出所有满足以下特性的6位整数:它是一个完全平方数(完全平方数是指该数是某个整数的平方),该数同时也是回文数(回文数是指该数等于它的反序数)。例如,698896是836的平方并且698896是回文数,因此698896是满足所给条件的6位整数。输出所有满足上述条件的6位整数。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 在这里插入图片描述

    #include  "stdio.h"
    #include  "math.h"
    int main()
    {
    	int i,j,k;
    	for(i=100000;i <=999999;i++){
    		j=i;
    		k=0;
    		while(j!=0){
    			k=k*10+j%10;
    			j=j/10;
    		}
    		if(i==k&&(int)sqrt(i)==sqrt(i))
    			printf("%d\n",i);
    	}
    }
    
    //需要引入的文件
    #include "stdio.h"
    int main() {
      int a=836,b,c,d,j;
      a*=a;
      c=a;
      for (int i = 0; i < 1; i++)
      {
          d=5;
          for (int i = 0; i < 6; i++)
          {
              b=(a%10) ;
              j+=b*pow(10,d--);
              a=a/10;
          }
          if (c==j)
          {
              printf("%d",c);
          }
          else
           printf("%d",c);
          
      }
    }
    
  • 以下回答由chatgpt基于相关博客总结生成:

    问题回答:

    可以使用选择法对给定的 n 个整数进行排序,要求按照从大到小的顺序排序,并输出每一趟排序后的结果。输入格式为一个包含 n 个整数的数组,输出格式为每一趟排序后的数组。以下是一个样例输入输出:

    输入:

    arr = [5,7,3,9,2]

    输出:

    第1趟排序后:[9,7,3,5,2]

    第2趟排序后:[9,7,3,5,2]

    第3趟排序后:[9,7,5,3,2]

    第4趟排序后:[9,7,5,3,2]

    第5趟排序后:[9,7,5,3,2]

    选择排序的基本思路是每一趟从数组中选择最大的数放到数组的最后面。

    具体步骤如下:

    1.找到数组中最大的数以及它在数组中的位置index

    2.将数组的第i项与第index项交换

    3.输出第i趟排序后的数组

    重复上述步骤,直到整个数组排序完成。

    以下是代码示例:

    def selectionSort(arr):
        n = len(arr)
        for i in range(n):
            # 找到最大值和它的位置
            max_index = i
            for j in range(i+1, n):
                if arr[j] > arr[max_index]:
                    max_index = j
            # 将找到的最大值交换到最后面
            arr[i], arr[max_index] = arr[max_index], arr[i]
            # 输出每一趟排序后的数组
            print("第{}趟排序后:{}".format(i+1, arr))
    
    # 测试样例
    arr = [5,7,3,9,2]
    selectionSort(arr)
    

    代码结果:

    第1趟排序后:[9, 7, 3, 5, 2]
    第2趟排序后:[9, 7, 3, 5, 2]
    第3趟排序后:[9, 7, 5, 3, 2]
    第4趟排序后:[9, 7, 5, 3, 2]
    第5趟排序后:[9, 7, 5, 3, 2]
    

    需要注意的限制包括:输入数据需要为一个包含 n 个整数的数组(没有规定具体的数据类型,可以是int、float等),时间限制和内存限制都取决于具体的实现方式和代码长度,代码长度需要控制在合适范围内,不要超过编译器或运行环境的限制(比如Python的限制为单个文件大小不超过4G)。