五个元素最少比较排序

输入格式:

第一行一个整数K,表明有多少例子

接着K行,每行5个整数,保证互不相同。

输出格式:

每个例子输出没有比较的元素对(用下标表示,小的在前),每个元素对占一行。元素对按字典序输出,输出结束再输出一个空行

参考学习:

#include <stdio.h>

int main() {
    int K;
    scanf("%d", &K);
    while (K--) {
        int a[6], i, j;
        for (i = 1; i <= 5; i++) {
            scanf("%d", &a[i]);
        }
        for (i = 1; i <= 4; i++) {
            for (j = i + 1; j <= 5; j++) {
                if (a[i] < a[j]) {
                    printf("%d %d\n", i - 1, j - 1);
                } else {
                    printf("%d %d\n", j - 1, i - 1);
                }
            }
        }
        printf("\n");
    }
    return 0;
}


首先读入整数K表示有K个测试样例。

然后每组数据读入5个整数,存储在数组a中。

接着使用双重循环枚举所有的元素对,如果第一个元素比第二个元素小,就输出它们的下标;否则交换它们的下标再输出。

最后输出一个空行表示当前测试结束。

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7719123
  • 你也可以参考下这篇文章:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组
  • 除此之外, 这篇博客: 位运算题解,数组中只有一个数出现了一次,其他数字都出现了k次,请输出只出现一次的数字中的 先将所有的数转换为k进制的数字,然后做不进位的加法,最后就剩下出现一次的k进制数,然后再将剩下的k进制数转换成十进制数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • public class 出现k次 {
    	public static void main(String[] args) {
    		int[] arr={2,2,2,9,7,7,7,3,3,3,6,6,6,0,0,0};
    		
    		int len = arr.length;
    		char[][] KRadix = new char[len][]; //字符二维数组存取每一个数的三进制的每一位
    		int k =3;
    		
    		//记录转成k进制数的最长位数,用来看最后需要计算多少列
    		int maxLen = 0;
    		//转成k进制数字
    		//对于每个数字
    		for(int i = 0;i<len;i++)
    		{
    			//求每个数字的三进制字符串并反转,然后转为字符数组    目的的将每个k进制数的低位对齐(因为转成k进制数的位数不同)
    			KRadix[i] = new StringBuilder(Integer.toString(arr[i], k)).reverse().toString().toCharArray();
    			if(KRadix[i].length > maxLen)
    			{
    				maxLen = KRadix[i].length;
    			}
    		}
    		
    		//存放做完不进位加法每一位和
    		int[] resArr=new int[maxLen];
    		//做不进位加法
    		for(int i = 0;i<len;i++)
    		{
    			//不进位加法
    			for(int j = 0;j<maxLen;j++)
    			{
    				//如果j大于等于当前数组长度的话,就需要补0
    				if(j >=KRadix[i].length)
    				{
    					resArr[j]+=0;
    				}else
    				{
    					resArr[j] += (KRadix[i][j]-'0');
    				}
    			}
    		}
    		int res = 0;
    		for(int i = 0;i<maxLen;i++)
    		{
    			res+=(resArr[i]%k)*(int)(Math.pow(k, i));
    		}
    		System.out.println(res);
    	}
    }

  • 您还可以看一下 孙玖祥老师的图解数据结构与算法课程中的 平衡二叉树的定义和不平衡原因分析小节, 巩固相关知识点