【数据结构】编写一个算法,对n个关键字取整数值的记录序列进行整理,以使所有关键字为负值的记录排在关键字为非负值的记录之前

编写一个算法,对n个关键字取整数值的记录序列进行整理,以使所有关键字为负值的记录排在关键字为非负值的记录之前,要求:
(1)采用顺序存储结构,至多使用一个记录的辅助存储空间;
(2)算法的时间复杂的为O(n);

以下是c语言代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define n 5
void process(int A[n]);
int main() {
	int A[n] = { 1, 2, -1, -2, 3 };
	process(A);
	for (int i = 0; i < n; i++)
		printf("%d ", A[i]);

	return 0;
}
void process(int A[n]) {
	int low = 0;
	int high = n - 1;
	while (low < high) {
		while (low < high && A[low] < 0)  low++;
		while (low < high && A[high]>0) high--;
		if (low < high) {
			int x = A[low];
			A[low] = A[high];
			A[high] = x;
			low++;  high--;
		}
	}
	return;
}

代码的思路很简单,low和high分别从数组头和数组尾部开始向前向后走,及时交换对应的元素值保证low走过的元素都为负,high走过的元素都为正。(low的作用是保证前low个元素都为负值,high保证后high个元素都为正,当low>=high的时候遍历完了整个数组,也就达到了题目要求,即负值在前,正值在后)具体如下:

  1. low这边,如果第low个元素小于0,那么符合我们要的负值在前,low继续增加,反之如果low对应元素大于0,那么low不变,等待和后面的high对应的元素进行交换。
  2. high对应的元素和low恰好相反。

当刚好现在的情况满足第low个元素大于0,第high个元素小于0时,交换两者对应的元素即可。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值