用c语言写出快速排序的非递归算法采用队列实现
时间: 2023-07-12 19:47:14 浏览: 205
好的,以下是用C语言实现快速排序的非递归算法,采用队列实现:
```
#include <stdio.h>
#define MAX_SIZE 100
// 队列结构体
typedef struct {
int front, rear;
int data[MAX_SIZE];
} Queue;
// 初始化队列
void initQueue(Queue* q) {
q->front = q->rear = -1;
}
// 判断队列是否为空
int isQueueEmpty(Queue* q) {
return q->front == -1 && q->rear == -1;
}
// 判断队列是否已满
int isQueueFull(Queue* q) {
return q->rear == MAX_SIZE - 1;
}
// 入队操作
void enqueue(Queue* q, int val) {
if (isQueueFull(q)) {
printf("Queue is full\n");
return;
} else if (isQueueEmpty(q)) {
q->front = q->rear = 0;
} else {
q->rear++;
}
q->data[q->rear] = val;
}
// 出队操作
int dequeue(Queue* q) {
if (isQueueEmpty(q)) {
printf("Queue is empty\n");
return -1;
} else if (q->front == q->rear) {
int val = q->data[q->front];
q->front = q->rear = -1;
return val;
} else {
int val = q->data[q->front];
q->front++;
return val;
}
}
// 快速排序的非递归实现
void quickSortNonRecursion(int a[], int n) {
int left = 0, right = n - 1;
Queue q;
initQueue(&q);
enqueue(&q, left);
enqueue(&q, right);
while (!isQueueEmpty(&q)) {
int l = dequeue(&q);
int r = dequeue(&q);
if (l >= r) continue;
int i = l, j = r, pivot = a[l];
while (i < j) {
while (i < j && a[j] >= pivot) j--;
if (i < j) a[i++] = a[j];
while (i < j && a[i] < pivot) i++;
if (i < j) a[j--] = a[i];
}
a[i] = pivot;
enqueue(&q, l);
enqueue(&q, i - 1);
enqueue(&q, i + 1);
enqueue(&q, r);
}
}
// 测试程序
int main() {
int a[] = {10, 7, 8, 9, 1, 5};
int n = sizeof(a) / sizeof(a[0]);
printf("Original array: ");
for (int i = 0; i < n; i++) {
printf("%d ", a[i]);
}
printf("\n");
quickSortNonRecursion(a, n);
printf("Sorted array: ");
for (int i = 0; i < n; i++) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
```
在这个算法中,我们使用队列来存储每个子序列的左右端点,以便后续处理。在每次循环中,我们从队列中取出一个子序列,并进行快速排序的一次划分操作。然后将左右两个子序列的左右端点加入队列,以便后续处理。最终,当队列为空时,所有子序列都已经排好序了。
阅读全文