将顺序表(a1,a2,…,an)重新排列以a1为界的两部分:a1前面的值均比a1小,a1后面的值均比a1大(这里假设数据元素的类型具有可比性,不妨设为整型)。用C语言写程序实现上述要求
时间: 2024-09-20 20:01:42 浏览: 45
在C语言中,可以采用双指针法来实现这个功能。首先,我们需要两个指针,一个指向数组的开始(left),另一个指向a1之后的位置(right)。然后我们比较这两个位置的元素,如果left指向的元素大于a1,我们就将它与right指向的元素交换,并向左移动left指针;反之,如果left指向的元素小于等于a1,则不动,直到left指针超过a1。最后,right指针就停在了所有大于a1的元素之前。
以下是简单的C语言函数实现:
```c
#include <stdio.h>
void partition(int arr[], int n, int a1) {
if (n == 0 || arr[0] >= a1) return; // 如果数组为空或第一个元素已满足条件,直接返回
int left = 0;
int right = 1;
while (right < n) {
if (arr[right] <= a1) { // 如果右侧元素小于等于a1
left++;
// 交换左侧和右侧元素
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
} else {
right++; // 否则,右移指针
}
}
}
// 示例数组
int main() {
int arr[] = {5, 8, 3, 1, 6, 9, 4};
int n = sizeof(arr) / sizeof(arr[0]);
int a1 = 4;
partition(arr, n, a1);
printf("分区后的数组: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
```
运行这段代码后,你会看到数组`arr`被重新排列,使得所有小于等于`a1`的元素都在`a1`之前,大于`a1`的元素在`a1`之后。
阅读全文