解题思路:
选择排序的原理:从数组的第一个数开始遍历整个数组,找到最小数并于数组的第一个数交换,下一轮再从第二个数开始遍历,以此类推。
注意事项:
(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分
4 人评分
C语言训练-阿姆斯特朗数 (C语言代码)浏览:897 |
C语言程序设计教程(第三版)课后习题7.2 (C语言代码)浏览:686 |
C语言训练-大、小写问题 (C语言代码)浏览:649 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:624 |
数对 (C语言代码)浏览:762 |
钟神赛车 (C语言代码)浏览:665 |
C语言程序设计教程(第三版)课后习题8.2 (C语言代码)浏览:1108 |
1162答案错误,为什么浏览:700 |
C语言程序设计教程(第三版)课后习题10.1 (C语言代码)浏览:826 |
2003年秋浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:639 |