解题思路:
选择排序的原理:从数组的第一个数开始遍历整个数组,找到最小数并于数组的第一个数交换,下一轮再从第二个数开始遍历,以此类推。
注意事项:
(1)在找bug时浪费了大量时间,因为我不会用断点,debug纯靠手动添一些cout语句看输出。
我一直以为是指针写的有问题,比如忘记写*,忘记写&,等等,结果后来发现问题在于我传入的参数是(int* arr),试图在里面用sizeof()来获取arr[]的长度,然而这样得到的长度仅仅是int指针的长度,即4bytes。这就导致我的len = 2,每次循环只改了数组的前两个数。
所以我现在才理解为什么书上的排序算法代码都会多传一个length,原来只有new和malloc分配的数组是自带长度的,如果是下面这种:
int arr[10]; int *p = arr;
只靠p指针是没法得知arr[]的长度的。
(2)如果不传指针直接传数组进来呢?想啥呢,就算写成(int[] arr),传进来的也是arr数组首元素的地址。不会有人觉得能传一堆数字进来吧。
(3)我在函数里定义了min指针,因为一直想着每轮循环随着i向后推进,必须有一个指针来定位当前最小值。但实际上完全有不需要指针的做法:
void selectSort(int* arr, int len) { //对于传入的非new方式构造的数组指针,没法计算其指向数组的大小 for(int i = 0; i < len; i++) { int index = i; for(int j = i + 1; j < len; j++) { if(arr[j] < arr[index]) { index = j; } } swap(arr[i], arr[index]); //自带的交换函数 } }
用一个整型变量代表最小值的地址的就好了。我真是个傻子。
参考代码:
#include <iostream> using namespace std; const int MAX = 10; //数组大小 void selectSort(int* arr, int len); //选择排序 int main() { int val = 0; //待读取的数组元素 int arr[MAX] = {0}; //初始化数组 for(int i = 0; i < MAX; i++) { cin >> arr[i]; } selectSort(arr, MAX); for(int *p = arr; p < (arr + MAX); p++) { cout << *p << " "; //用指针输出数组 } return 0; } void selectSort(int* arr, int len) { //对于传入的非new方式构造的数组指针,没法计算其指向数组的大小 for(int i = 0; i < len; i++) { int *min = &arr[i]; //此指针用于定位,指向每一轮循环中最小数的地址 for(int j = i + 1; j < len; j++) { if(arr[j] < *min) { min = &arr[j]; //找到更小数就更新min指针 } } swap(arr[i], *min); //自带的交换函数 } }
0.0分
3 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复