请针对三向切分给出c语言实现
时间: 2024-10-11 11:11:18 浏览: 11
冒泡排序、插入排序和快速排序 冒泡法排序c语言程序
三向切分快速排序的C语言实现主要针对有大量重复元素的情况,这里是一个简单的版本:
```c
#include <stdio.h>
// 定义交换函数
void swap(int* a, int* b) {
int t = *a;
*a = *b;
*b = t;
}
int partitionThreeWay(int arr[], int low, int high) {
int pivot = arr[low], i = low, j = high, k = low;
while (i <= j) {
// 小于pivot的元素移到左边
if (arr[i] < pivot) {
swap(&arr[i], &arr[k++]);
}
// 等于pivot的元素保持不变
else if (arr[i] == pivot) {
i++;
}
// 大于pivot的元素移到右边
else {
swap(&arr[j], &arr[i++]);
}
}
return k;
}
void quicksortThreeWay(int arr[], int low, int high) {
if (low < high) {
int pi = partitionThreeWay(arr, low, high);
quicksortThreeWay(arr, low, pi - 1);
quicksortThreeWay(arr, pi + 1, high);
}
}
int main() {
int arr[] = {5, 9, 2, 7, 2, 6, 2, 8, 4, 2};
int n = sizeof(arr) / sizeof(arr[0]);
printf("Before sorting:\n");
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
printf("\n");
quicksortThreeWay(arr, 0, n - 1);
printf("After sorting:\n");
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
printf("\n");
return 0;
}
```
这个代码首先定义了一个`partitionThreeWay`函数,实现了数组的三向切分,并在`quicksortThreeWay`函数中递归地应用该方法。注意这里的`swap`函数用于临时交换元素位置。
阅读全文