c语言快速排序非递归
时间: 2023-09-12 18:09:39 浏览: 125
快速排序是一种常用的排序算法,它通过选择一个基准元素,将数组分割成两个子数组,然后对子数组进行递归排序,最终得到一个有序数组。
下面是使用非递归方式实现的快速排序算法的C语言代码示例:
```c
#include <stdio.h>
#define MAX_STACK_SIZE 100
// 交换两个元素的值
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 快速排序的非递归实现
void quickSort(int arr[], int left, int right) {
// 创建一个栈用于存储待排序子数组的起始和结束下标
int stack[MAX_STACK_SIZE];
int top = -1;
// 初始时将整个数组的起始和结束下标入栈
stack[++top] = left;
stack[++top] = right;
while (top >= 0) {
// 出栈获取当前待排序子数组的起始和结束下标
right = stack[top--];
left = stack[top--];
// 选择基准元素为子数组的最后一个元素
int pivot = arr[right];
int i = left - 1;
// 将小于等于基准元素的元素放到左侧,大于基准元素的元素放到右侧
for (int j = left; j <= right - 1; j++) {
if (arr[j] <= pivot) {
i++;
swap(&arr[i], &arr[j]);
}
}
// 将基准元素放到正确的位置
swap(&arr[i + 1], &arr[right]);
// 如果左侧子数组的长度大于1,则将左侧子数组的起始和结束下标入栈
if (i - left + 1 > 1) {
stack[++top] = left;
stack[++top] = i;
}
// 如果右侧子数组的长度大于1,则将右侧子数组的起始和结束下标入栈
if (right - i - 1 > 1) {
stack[++top] = i + 2;
stack[++top] = right;
}
}
}
int main() {
阅读全文