不使用递归方法的快速排序函数 C语言
时间: 2024-03-15 20:20:53 浏览: 63
以下是不使用递归方法的快速排序函数的C语言代码:
```c
#include <stdio.h>
void quickSort(int arr[], int left, int right) {
int stack[right - left + 1]; // 定义一个栈
int top = -1;
stack[++top] = left; // 将左右边界入栈
stack[++top] = right;
while (top >= 0) {
right = stack[top--]; // 弹出右边界
left = stack[top--]; // 弹出左边界
int i = left, j = right, pivot = arr[left]; // 选择第一个元素作为基准元素
while (i < j) {
while (i < j && arr[j] >= pivot) j--; // 从右往左找到第一个小于基准元素的元素
if (i < j) arr[i++] = arr[j]; // 将该元素放到基准元素左边
while (i < j && arr[i] < pivot) i++; // 从左往右找到第一个大于等于基准元素的元素
if (i < j) arr[j--] = arr[i]; // 将该元素放到基准元素右边
}
arr[i] = pivot; // 将基准元素放到正确位置
if (i - 1 > left) { // 如果左边有元素,将左边界和右边界入栈
stack[++top] = left;
stack[++top] = i - 1;
}
if (i + 1 < right) { // 如果右边有元素,将左边界和右边界入栈
stack[++top] = i + 1;
stack[++top] = right;
}
}
}
int main() {
int arr[] = {5, 3, 9, 2, 8, 7, 1, 10, 4, 6};
int n = sizeof(arr) / sizeof(arr[0]);
quickSort(arr, 0, n - 1);
printf("排序后的数组:");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
```
该函数使用了一个栈来存储待排序子序列的左右边界。每次从栈中弹出一个左右边界,进行一轮快速排序。如果左边或右边还有元素,将左右边界入栈,继续下一轮排序。由于该算法不使用递归,因此避免了递归调用产生的额外开销,可以提高效率。
阅读全文