设有一个整数顺序表L。设计一个算法,以第一个元素为分界线(基准),将所有小于等于它的元素移到该元素的前面,将所有大于它的元素移到该元素的后面。c语言实现
时间: 2024-09-09 16:02:08 浏览: 139
这个问题描述的是一个经典的数组划分问题,通常称为“荷兰国旗问题”,其目的是将数组中所有小于某个特定值(基准)的元素移动到该值的左边,而所有大于该值的元素移动到右边。C语言中可以使用三指针算法来解决这个问题。下面是一个简单的实现示例:
```c
#include <stdio.h>
// 交换数组中的两个元素
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 划分函数,以第一个元素为基准
void partition(int L[], int n) {
int pivot = L[0]; // 基准元素设为第一个元素
int i = 1; // i 指针从第二个元素开始
int j = n - 1; // j 指针指向数组末尾
while (i <= j) {
if (L[i] <= pivot) {
i++; // 如果当前元素小于等于基准,i向右移动
} else {
swap(&L[i], &L[j]); // 否则与j指针指向的元素交换
j--; // j指针向左移动
}
}
// 将基准元素放到正确位置(由于数组的前i-1个元素都小于等于基准,所以i-1是基准元素的正确位置)
swap(&L[0], &L[i-1]);
}
// 打印数组的函数
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
// 主函数
int main() {
int L[] = {3, 1, 4, 2, 5}; // 原始数组
int n = sizeof(L) / sizeof(L[0]); // 数组长度
printf("原始数组: ");
printArray(L, n);
partition(L, n); // 调用划分函数
printf("划分后的数组: ");
printArray(L, n);
return 0;
}
```
这个程序首先定义了一个swap函数来交换两个元素的值,然后定义了partition函数来完成主要的划分工作。在主函数中,我们定义了一个整数数组L,并调用partition函数对其进行划分,最后打印出划分后的数组。
阅读全文