C++二维数组的元素值按升序排列——选择排序

关于这个题当真是困扰了我好一阵子,今天终于是解决了,赶紧来给跟我一样陷入迷茫的新手指明一下方向以及点一下我的易错点,共勉!

关于这个问题我给出了两个不同的方法,一是将二维数组看成一维数组,二是运用指针的思想来简化算法。

其实这个问题一个是可能不明白如何将二维数组看成一维数组(for example me...)再一个就是指针的问题了 哈哈哈 希望我写的代码可以使你明白一些~

一、将二维数组一维化

好吧,直接上代码,里面标注了我希望读者看到的一些注意的点及批注~

#include<iostream>
using namespace std;
int main(){



    int a[3][3] = { 5, 9, 4, 5, 9, 5, 4, 3, 1 };
	int i, j, x, y, t;
	int x1, y1, min, temp;
	    // 注意是选择排序
	for (i = 0; i < 8;i++)    // 此处将二维数组看成一维数组, 可以想象成从第一行弯弯绕绕下来的一维数组 
		    // 注意此处是小于8
	{
		t = i;   // 记录当前最小值的 位置
		x = t/ 3;  //除以列
		y = t % 3;   //取余列
		min = a[x][y];  // 当前最小值的元素
		
		for (j = i+1; j < 9; j++)   //此处是小于9                                                        
		{
			x1 = j / 3;
			y1 = j % 3;
			if (a[x1][y1] < a[x][y])   // 每一次遍历的元素与当前最小元素相比较
			{
				min = a[x1][y1];   // 最先元素被不断替代
				t = j;   //t被重新赋值,并记录当前最小值的 位置
				x = t / 3;   
				y = t % 3;      //a[x][y]每次要存放的是当前遍历中最小的值,是不断更新取代的,不是总是某个元素某个值
			}
		}


		//x1 = i / 3;     由于这两个变量被闲置且这样写后来的代码更简便,所以此处可以重新赋值
		//y1 = i % 3;     但我本人一个新手来说还是那样直接表示更能使我自己看的明白哈哈哈
		if ( t != i)
		{        //用寻找出来的最小值与当前位置元素互换
			temp = a[i / 3][i % 3];
			a[i / 3][i % 3] = a[x][y];
			a[x][y] = temp;
		}
	}

	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++)
		{
			cout << a[i][j];
		}
		cout << endl;
	}
	return 0;


}
	

二、用指针方法

我个人之前一碰到指针的问题就头疼,但解完这个题后对指针的使用也有了更加清晰的认知,希望读者看到我写的代码后也能更清楚的明白指针在解一些问题真的是很简便,但也不要急于求成,稳扎稳打得来,一点点积累一点点领悟,不要把指针看成洪水猛兽,这块如意珍宝也可以掌握在你的手里~

#include<iostream>
using namespace std;
int main() {
	int a[3][3], i, j, t,  temp;
	cout << "请输入9个数:";
	cout << endl;
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++)
		{
			cin >> a[i][j];
		}
	}
	int* pa = &a[0][0];    //注意此处是加了取地址符的,我本人在编译的时候也发现了这里的错误了哈哈哈   当然 这里也可以写成a[0]
	for (i = 0; i < 8; i++)    // 因为不管是一维数组二维数组它们在内存中的地址都是一片连续的区域
	{   //用指针的思想来解题也就避免了在固有思维二维数组中找最大最小遍历的问题(不知怎么在选定第一个位置的前提下遍历所有二维数组元素的问题)
		t = i;    // 还是先标记第一个的位置   
		for (j = i + 1; j < 9; j++)
		{
			if (*(pa + t)> *(pa + j))   // 这里比较的时候一定要是一个会动的含有被标记变量t的式子  这也是我常常犯的错误
			{
				t = j;   // 标记新的最小值的位置
			}
		}
		if (t != i)   // 将最小值与数组的第几个位置的元素互换
		{   //注意: 并不是t与第几个元素互换,那样的话只是将数组内元素与找到的最小值或最大值的元素 也就是t的值互换了 
			temp = *(pa + i);    //数组内最小值或最大值的元素即位置依然没变
			*(pa +i) = *(pa + t);   // t存放的就是最小值或最大值的位置
			*(pa + t) = temp;
		}
	}

	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++)
		{
			cout << a[i][j];

		}
		cout << endl;
	}
	return 0;

}

// 选择排序的二维数组排序

最后,我们在做这类排序问题的时候,要比较熟练的掌握选择冒泡等一些排序的算法,这样才不至于像我一样,在这个问题花了好多时间......

最后的最后,欢迎看到这篇文章的读者给我留言和私信,我们共同探讨问题,最重要的是,如有什么地方写的不好,欢迎批评指正~

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值