林惜城


私信TA

用户名:reminder

访问量:31296

签 名:

等  级
排  名 91
经  验 9070
参赛次数 0
文章发表 95
年  龄 0
在职情况 学生
学  校 西安电子科技大学
专  业

  自我简介:

哈姆


解题思路:

选择排序的原理:从数组的第一个数开始遍历整个数组,找到最小数并于数组的第一个数交换,下一轮再从第二个数开始遍历,以此类推。


注意事项:

(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 人评分

  评论区

  • «
  • »