源码制作网站教程装修招标网站
2026/2/22 15:33:04 网站建设 项目流程
源码制作网站教程,装修招标网站,眼前一亮的公司名,广东高端网站设计公司思路#xff1a;题目说明用二分查找#xff0c;每次查找向下取整#xff0c;就清楚是跟二分查找有关了。但是需要注意题目其实并没有说输入的数组是有序的#xff0c;所以在二分查找之前我们必须要先排序。考虑到时间复杂度的问题#xff0c;这里我们选择用快速排序的方法…思路题目说明用二分查找每次查找向下取整就清楚是跟二分查找有关了。但是需要注意题目其实并没有说输入的数组是有序的所以在二分查找之前我们必须要先排序。考虑到时间复杂度的问题这里我们选择用快速排序的方法。转自豆包qsort()是 C 标准库stdlib.h中的快速排序函数用于对任意类型的数组进行排序是 C 语言中常用的通用排序工具。一、基本语法cvoid qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *));参数说明base待排序数组的首地址任意类型指针nitems数组的元素个数size数组中单个元素的字节大小例如int类型填sizeof(int)compar比较函数指针用于定义两个元素的比较规则。二、比较函数的规则比较函数的格式必须为cint compar(const void *a, const void *b);函数逻辑返回值 0a应排在b之前返回值 0a和b相等返回值 0a应排在b之后。代码如下#include stdio.h #include stdlib.h // qsort的比较函数升序 int cmp(const void *a, const void *b) { return *(int *)a - *(int *)b; } int main() { int n, target; // 多组输入EOF终止 while (scanf(%d, n) ! EOF) { int arr[n]; // 1. 输入无序数组 for (int i 0; i n; i) { scanf(%d, arr[i]); } // 2. 输入目标值 scanf(%d, target); // 3. 对数组升序排序关键让二分查找可行 qsort(arr, n, sizeof(int), cmp); // 4. 二分查找逻辑与之前一致 int left 0, right n - 1; int count 0; int found 0; while (left right) { count; int mid (left right) / 2; if (arr[mid] target) { found 1; break; } else if (arr[mid] target) { left mid 1; } else { right mid - 1; } } // 5. 输出结果 if (found) { printf(%d\n, count); } else { printf(NO.\n); } } return 0; }题2思路将非负数和负数分离并记录原位置分别按要求排序把排好序的输入到原位置即可。这里我们同样需要用到快速排序并对它有进一步的了解。代码如下#include stdio.h #include stdlib.h // 非负数排序升序从小到大 int compare_non_neg(const void *a, const void *b) { return (*(int *)a - *(int *)b); } // 负数排序降序即绝对值从小到大-1 -2 int compare_neg(const void *a, const void *b) { return (*(int *)b - *(int *)a); } int main() { int n; // 输入序列长度 scanf(%d, n); int arr[n], res[n]; int non_neg[n], neg[n]; // 存储非负数、负数 int idx_non_neg 0, idx_neg 0; // 非负数、负数数组的索引 int pos_non_neg[n], pos_neg[n]; // 存储非负数、负数在原数组中的位置 // 输入原序列并分离非负数/负数记录位置 for (int i 0; i n; i) { scanf(%d, arr[i]); if (arr[i] 0) { non_neg[idx_non_neg] arr[i]; pos_non_neg[idx_non_neg] i; // 记录非负数的原位置 idx_non_neg; } else { neg[idx_neg] arr[i]; pos_neg[idx_neg] i; // 记录负数的原位置 idx_neg; } } // 对非负数、负数分别排序 qsort(non_neg, idx_non_neg, sizeof(int), compare_non_neg); qsort(neg, idx_neg, sizeof(int), compare_neg); // 初始化结果数组可选避免随机值 for (int i 0; i n; i) { res[i] 0; } // 回填非负数到原位置 for (int i 0; i idx_non_neg; i) { res[pos_non_neg[i]] non_neg[i]; } // 回填负数到原位置 for (int i 0; i idx_neg; i) { res[pos_neg[i]] neg[i]; } // 输出结果 for (int i 0; i n; i) { printf(%d , res[i]); } printf(\n); return 0; }转自豆包简化了一下要理解这个比较函数里的指针用法就要理解qsort对比较函数的要求qsort是 C 标准库的通用排序函数能排序任意类型的数据int、char、结构体等所以它的比较函数参数被设计成const void *类型const void *a/const void *b表示 “指向任意类型数据的指针”且指针指向的内容不可修改const但我们要排序的是int类型数组所以必须把void*转换成int*才能操作这是指针转换的核心原因。C 标准库qsort的排序顺序由 “比较函数” 控制qsort是通用排序函数它的排序顺序由比较函数的返回值决定若希望升序比较函数返回*(int*)a - *(int*)b若希望降序比较函数返回*(int*)b - *(int*)a。有了这些基本知识的了解就能用好快速排序了

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询