非递归快速排序 C语言实现 - 代码解析与优化
以下是一个非递归的快速排序的 C语言程序:
#include <stdio.h>
#define MAX_STACK_SIZE 100
struct stack {
int l;
int r;
};
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
int partition(int arr[], int l, int r) {
int pivot = arr[r];
int i = l - 1;
for (int j = l; j <= r - 1; j++) {
if (arr[j] < pivot) {
i++;
swap(&arr[i], &arr[j]);
}
}
swap(&arr[i + 1], &arr[r]);
return i + 1;
}
void quick_sort(int arr[], int l, int r) {
struct stack s[MAX_STACK_SIZE];
int top = -1;
s[++top].l = l;
s[top].r = r;
while (top >= 0) {
l = s[top].l;
r = s[top].r;
top--;
int p = partition(arr, l, r);
if (p - 1 > l) {
s[++top].l = l;
s[top].r = p - 1;
}
if (p + 1 < r) {
s[++top].l = p + 1;
s[top].r = r;
}
}
}
int main() {
int arr[] = { 10, 7, 8, 9, 1, 5 };
int n = sizeof(arr) / sizeof(arr[0]);
quick_sort(arr, 0, n - 1);
printf("Sorted array: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
该程序使用一个结构体数组来实现非递归的快速排序。首先将整个数组的左右端点入栈,然后开始循环:取出栈顶元素(即左右端点),进行一次快速排序的过程,将分割点的左半部分和右半部分的左右端点入栈。这样,每次取出栈顶元素时,都会对其进行一次快速排序,直到栈为空。
优化建议:
- 栈大小优化: 可以根据实际数据规模调整
MAX_STACK_SIZE的值,避免内存浪费。 - 递归和非递归的比较: 在某些情况下,递归实现的快速排序可能更高效,需要根据实际情况进行选择。
- 优化
partition函数: 可以尝试使用不同的分割策略,例如三数取中法,以提高排序效率。 - 使用更快的排序算法: 如果对效率要求极高,可以考虑使用更快的排序算法,例如归并排序或堆排序。
总结:
本文提供了一个非递归的快速排序 C语言程序,并详细解释了程序实现原理和优化技巧。代码简洁易懂,适合初学者学习参考。希望本文对您学习和理解快速排序算法有所帮助。
原文地址: https://www.cveoy.top/t/topic/nSJu 著作权归作者所有。请勿转载和采集!