修改下面代码#include<iostream> #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define MAXSIZE 100 using namespace std; typedef int KeyType; typedef char InfoType; typedef int Status; typedef struct { KeyType key; }ElemType; typedef struct { ElemType* r; int length; }SqList; Status InitSqList(SqList &L) { L.r = new ElemType[MAXSIZE]; if (!L.r) exit(OVERFLOW); L.length = 0; return OK; } Status InsertElem(SqList& L,int i, ElemType e) { if ((i < 1) || (i > L.length+1)) return ERROR; if (L.length == MAXSIZE) return ERROR; for (int j = L.length - 1; j >= i - 1; --j) { L.r[j + 1] = L.r[j]; } L.r[i - 1] = e; ++L.length; return OK; } void PrintSqList(SqList L) { for (int i = 0; i < L.length; ++i) cout << L.r[i].key << " "; cout << endl; } int Partition(SqList& L, int low, int high) { int pivotkey; L.r[0] = L.r[low]; pivotkey = L.r[low].key; while (low < high) { while (low < high && L.r[high].key >= pivotkey) --high; L.r[low] = L.r[high]; while (low < high && L.r[low].key <= pivotkey) ++low; L.r[high] = L.r[low]; } L.r[0] = L.r[low]; return low; } void QSort(SqList& L, int low, int high) { int pivotloc; if (low < high) { pivotloc = Partition(L, low, high); QSort(L, low, --pivotloc); QSort(L, ++low, high); } } void QuickSort(SqList& L) { QSort(L, 1, L.length); } int main() { SqList L; InitSqList(L); cout << "排序前的顺序表" << endl; PrintSqList(L); QuickSort(L); cout << "排序后的顺序表" << endl; PrintSqList(L); return 0; }
时间: 2024-03-03 14:49:31 浏览: 107
这段代码实现了一个基于快速排序的排序算法。在主函数中,首先初始化了一个空的顺序表L,然后打印出排序前的顺序表。接着调用QuickSort函数对L进行排序,最后再次打印出排序后的顺序表。
这段代码存在一些问题,比如:
1. 在初始化顺序表时,数组r没有进行初始化,导致r中的元素值是未知的,可能会影响排序结果。
2. 在InsertElem函数中,如果插入位置i不合法或者顺序表已满,返回的结果是ERROR,但是并没有给出具体的错误信息,这样可能会让调用者不知道问题出在哪里。
3. 在Partition函数中,将low位置的元素作为基准元素,可能会导致排序结果不稳定。
4. 在QSort函数中,对于pivotloc的更新方式不够严谨,可能会导致死循环。
下面是修改后的代码,对上述问题进行了修正:
```c++
#include<iostream>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define MAXSIZE 100
using namespace std;
typedef int KeyType;
typedef char InfoType;
typedef int Status;
typedef struct {
KeyType key;
}ElemType;
typedef struct {
ElemType r[MAXSIZE]; // 直接定义数组,避免动态分配内存
int length;
}SqList;
Status InitSqList(SqList &L) {
L.length = 0;
return OK;
}
Status InsertElem(SqList& L,int i, ElemType e) {
if (i < 1 || i > L.length + 1) {
cout << "插入位置不合法!" << endl;
return ERROR;
}
if (L.length >= MAXSIZE) {
cout << "顺序表已满!" << endl;
return ERROR;
}
for (int j = L.length - 1; j >= i - 1; --j) {
L.r[j + 1] = L.r[j];
}
L.r[i - 1] = e;
++L.length;
return OK;
}
void PrintSqList(SqList L) {
for (int i = 0; i < L.length; ++i)
cout << L.r[i].key << " ";
cout << endl;
}
int Partition(SqList& L, int low, int high) {
int pivotkey;
int mid = low + (high - low) / 2; // 取中间位置的元素作为基准元素
if (L.r[low].key > L.r[high].key) {
swap(L.r[low], L.r[high]);
}
if (L.r[mid].key > L.r[high].key) {
swap(L.r[mid], L.r[high]);
}
if (L.r[mid].key > L.r[low].key) {
swap(L.r[mid], L.r[low]);
}
pivotkey = L.r[low].key;
while (low < high) {
while (low < high && L.r[high].key >= pivotkey) --high;
L.r[low] = L.r[high];
while (low < high && L.r[low].key <= pivotkey) ++low;
L.r[high] = L.r[low];
}
L.r[low] = L.r[0];
return low;
}
void QSort(SqList& L, int low, int high) {
if (low < high) {
int pivotloc = Partition(L, low, high);
QSort(L, low, pivotloc - 1); // 注意这里是pivotloc - 1
QSort(L, pivotloc + 1, high); // 注意这里是pivotloc + 1
}
}
void QuickSort(SqList& L) {
QSort(L, 0, L.length - 1); // 注意这里是0和length-1
}
int main() {
SqList L;
InitSqList(L);
ElemType e;
for (int i = 1; i <= 10; ++i) {
e.key = rand() % 100;
InsertElem(L, i, e);
}
cout << "排序前的顺序表" << endl;
PrintSqList(L);
QuickSort(L);
cout << "排序后的顺序表" << endl;
PrintSqList(L);
return 0;
}
```
在修改后的代码中,我们直接定义了数组r,避免了动态分配内存所带来的麻烦。在InsertElem函数和Partition函数中,增加了一些错误处理和稳定性处理的代码,使算法更加稳定可靠。同时,我们在主函数中添加了随机生成元素的代码,以便进行测试。
阅读全文