在C语言中从已排序数组根据输入排名提取对应数值的实现问题
实现指导
核心逻辑
你当前实现的冒泡排序为升序排序,排序完成后数组元素从小到大依次存储,C语言数组下标从0开始,因此用户输入排名值rank后,对应数值的下标为rank - 1,直接读取该下标对应元素即可得到目标结果。
新增功能需要补充的步骤
- 调用
scanf接收用户输入的排名值 - 增加输入合法性校验:需保证输入的排名值≥1,且≤数组长度
n,避免数组越界导致程序异常
修改后的完整代码
#include <stdio.h> void swap(int *xp, int *yp) { int temp = *xp; *xp = *yp; *yp = temp; } // 实现冒泡排序的函数 void bubbleSort(int arr[], int n) { int i, j; for (i = 0; i < n-1; i++) // 末尾i个元素已经处于正确位置 for (j = 0; j < n-i-1; j++) if (arr[j] > arr[j+1]) swap(&arr[j], &arr[j+1]); } /* 打印数组的函数 */ void printArray(int arr[], int size) { int i; for (i=0; i < size; i++) printf("%d ", arr[i]); printf("\n"); } // 测试上述函数的主程序 int main() { int arr[] = {25000, 10000, 25000, 90000, 90000, 25000, 25000, 10000, 10000, 25000}; int n = sizeof(arr)/sizeof(arr[0]); bubbleSort(arr, n); printf("Sorted array: \n"); printArray(arr, n); // 新增排名查询逻辑 int rank; printf("请输入要查询的排名(输入数字越小返回数值越小):"); scanf("%d", &rank); // 输入合法性校验 if (rank < 1 || rank > n) { printf("输入不合法,请输入1到%d范围内的整数\n", n); return 1; } printf("排名%d对应的数值为:%d\n", rank, arr[rank - 1]); return 0; }
扩展说明
如果后续需要调整为输入数字越小输出数值越大的逆序排名逻辑,只需修改冒泡排序的比较条件:将if (arr[j] > arr[j+1])改为if (arr[j] < arr[j+1])即可,排名取值逻辑无需调整。
内容的提问来源于stack exchange,提问作者el_siego
相关产品推荐
相关产品推荐

