编写一个算法,对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的时候遍历完了整个数组,也就达到了题目要求,即负值在前,正值在后)具体如下:
- low这边,如果第low个元素小于0,那么符合我们要的负值在前,low继续增加,反之如果low对应元素大于0,那么low不变,等待和后面的high对应的元素进行交换。
- high对应的元素和low恰好相反。
当刚好现在的情况满足第low个元素大于0,第high个元素小于0时,交换两者对应的元素即可。