请教bobo老师,我在复习课程时按照双路快速排序的思想写出了如下的partition部分代码,出现了栈溢出,应该是递归逻辑出现了错误,对partition代码部分添加了注释,麻烦bobo老师看看
//对数组[l,r)部分进行partition
void partitionTwoWays(pTable& t, int l, int r) {
//将i设置第二个元素开始向后扫描,j设置为最后一个元素索引向左扫描
int i = l + 1, j = r - 1;
//暂时没有添加随机化,将区间第一个元素取为标定点
int v = t->data[l];
//数组的[l+1,i)部分<v
while (i <= j) {
//i扫描到>=v的元素停住开始用j从后往前扫描
if (t->data[i] >= v) {
//数组的(j,r-1]部分<v
while (i <= j) {
//j扫描到<=v的元素停住并交换i,j索引对应元素
if (t->data[j] <= v) {
swap(t->data[i], t->data[j]);
i++;
j--;
//交换完成后退出循环继续用i从左往右扫描
break;
}
else {
j--;
}
}
}
else {
i++;
}
}
//i和j相遇,将j与标定点l索引元素对调,把标定点放在该在的位置
swap(t->data[l], t->data[j]);
//递归分别对左右两个区间进行partition
partitionTwoWays(t, l, i);
partitionTwoWays(t, i + 1, r);
}
完整包含测试的代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
typedef int ElemType;
typedef struct table {
ElemType* data;
int length;
}table, * pTable;
void initTable(pTable& t, int length) {
t = (pTable)malloc(sizeof(table));
t->data = (ElemType*)malloc(sizeof(ElemType) * length);
t->length = length;
srand((unsigned int)time(NULL));
for (int i = 0; i < length; i++) {
t->data[i] = rand() % 100; //填充0~99的随机数
}
}
void printTable(pTable t) {
for (int i = 0; i < t->length; i++) {
printf("%3d", t->data[i]);
}
printf("\n");
}
void swap(ElemType& a, ElemType& b) {
ElemType temp;
temp = a;
a = b;
b = temp;
}
//双路快排
void partitionTwoWays(pTable& t, int l, int r);
void sortTwoWays(pTable& t) {
partitionTwoWays(t, 0, t->length);
}
//对数组[l,r)进行partition
void partitionTwoWays(pTable& t, int l, int r) {
int i = l + 1, j = r - 1;
int v = t->data[l];
while (i <= j) {
if (t->data[i] >= v) {
while (i <= j) {
if (t->data[j] <= v) {
swap(t->data[i], t->data[j]);
i++;
j--;
break;
}
else {
j--;
}
}
}
else {
i++;
}
}
swap(t->data[l], t->data[j]);
partitionTwoWays(t, l, i);
partitionTwoWays(t, i + 1, r);
}
//测试
int main() {
pTable t;
initTable(t, 10);
printTable(t);
sortTwoWays(t);
printTable(t);
}