C++笔试题——只使用0与数组中其它数交换进行排序

这道题目要求在一个包含[0, n-1]的乱序数组中,仅通过0与其他数交换来实现数组从小到大或从大到小的排序。对于升序排序,0会从下标1逐步移动到下标n-1,遇到正确位置的数则跳过;降序排序时,0从下标0移动到n-2,遇到正确位置的数也进行交换。最后根据0的位置调整完成排序。" 124556386,12650646,在Linux上使用Docker安装和配置MySQL8.0,"['Docker', '数据库', 'MySQL', 'Linux', '容器']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:一个长度为n的数组,乱序存放着[0, n-1],现在只允许0与其它数交换,将数组排序

从小到大排列的解题思路:将0依次从下标1移至下标n-1的位置,在移动过程中,如果当前位置i上的数已经是i了就直接进行下一步,若不是,就将0所在的位置替换成与下标相等的数,最后,判断位置0上的数字是不是0,如果不是,就将最后一个位置上的数字和0交换

从大到小排列的思路:将0依次从下标0移至下标n-2的位置,在移动过程中,如果当前位置i上的数已经是n-i-1了,就直接下一步,如果不是,就让n-i-1与0交换,最后,判断最后一个位置上的数是不是0,如果不是,就将最后这个位置上的数与0交换。

1、将数组从小到大排列

void print(int *array,int len) {
	for (int i = 0; i < len; i++) {
		cout << array[i] << " ";
	}
	cout << endl;
}

void swap_with_zero(int* array, int len, int n) {
	int pos0 = 0, posn = 0;
	int cnt = 0;
	for (int i = 0; i < len; i++) {
		if (array[i] == 0) {
			pos0 = i;
			cnt++;
		}
		if (array[i] == n) {
			posn = i;
			cnt++;
		}
		if (cnt == 2) {
			break;
		}
	}
	//cout << "0的位置:" << pos0 <<"    n的位置:"<< posn << endl;
	int temp = array[pos0];
	array[pos0] = array[posn];
	array[posn] = temp;
	//print(array,len);
	return;
}
void sort(int* array, int len) {
	//print(array,len);
	for (int i = 1; i<len; i++) {
		//如果该位置不是0
		if (array[i] != 0) {
			//不是0,但是值为i,直接进入下一个位置
			if (array[i] == i)continue;
			//不是0也不是i,先将这个位置上的值换成0,再将这个位置的值换成i
			else {
				swap_with_zero(array, len, array[i]);
				swap_with_zero(array, len, i);
			}
		}
		else {//是0,就直接换成i
			swap_with_zero(array, len, i);
		}
	}
	if (array[0] != 0) {//第一个位置上的值不是0,就将这个值和0交换
		swap_with_zero(array, len, array[0]);
	}
}


int main() {
	int array[] = { 5,3, 2, 4, 1,6, 7, 0 };
	int len = sizeof(array) / sizeof(int);
	sort(array, len);
	print(array,len);
	
	system("pause");
	return 0;
}

2、将数组从大到小排列,这个只有sort()函数中的部分操作不同,原理是一样的

void sort(int* array, int len) {
	//print(array,len);
	for (int i = 0; i<len-2; i++) {
		//如果该位置不是0
		if (array[i] != 0) {
			//不是0,但是为len - i - 1
			if (array[i] == len-i-1)continue;
			//不是0也不是len - i - 1,
			else {
				swap_with_zero(array, len, array[i]);
				swap_with_zero(array, len, len-i-1);
			}
		}
		else {
			swap_with_zero(array, len, len - i - 1);
		}
	}
	if (array[len - 1] != 0) {
		swap_with_zero(array, len, array[len -1]);
	}
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值