1040: 快速排序(2)
Description
已知快速排序的部分代码如下,勿改动,请利用栈实现快速排序非递归函数:void QuickSort(); //quickSort
#include<iostream>
using namespace std;
const int MaxSize=100;
class List
{
private:
int r[MaxSize+1];
int n;
public:
List(){n=0;} //empty list
void InsertR(int k) //表尾插入
{ r[++n]=k;}
void Display(); //display
void QuickSort(); //quickSort
};
void List::Display()
{
for(int i=1;i<=n;i++)
cout<<r[i]<<" ";
cout<<"\n";
}
int main()
{
List L;
while(1)
{
int k;
cin>>k;
if(!k) break;
L.InsertR(k);
}
L.Display();
L.QuickSort();
L.Display();
return 0;
}
Input
Output
Sample Input
12 21 32 2 4 24 21 432 23 9 0
Sample Output
12 21 32 2 4 24 21 432 23 9
2 4 9 12 21 21 23 24 32 432
//
// Created by Legends丶Hu on 2020/2/8.
//
#include<iostream>
//#include "Stack.h"
using namespace std;
const int StackSize = 100;
template<class T>
class Stack {
private:
int top;
T data[StackSize];
public:
Stack();
void Push(T x);
T Pop();
T GetTop();
int Empty();
~Stack() {}
};
template<class T>
void Stack<T>::Push(T x) {
if (top == StackSize - 1) throw "Overflow";
data[++top] = x;
}
template<class T>
Stack<T>::Stack() {
top = -1;
}
template<class T>
T Stack<T>::Pop() {
if (Empty()) throw "Downflow";
return data[top--];
}
template<class T>
T Stack<T>::GetTop() {
return Empty() ? throw "Downflow" : data[top];
}
template<class T>
int Stack<T>::Empty() {
return top == -1;
}
const int MaxSize = 100;
class List {
private:
int r[MaxSize + 1];
int n;
public:
List() { n = 0; } //empty list
void InsertR(int k) //表尾插入
{ r[++n] = k; }
void Display(); //display
void QuickSort(); //quickSort
};
int Partition(int r[], int first, int end) {
int i = first, j = end;
while (i < j) {
while (i < j && r[i] <= r[j])j--;
if (i < j) {
swap(r[i], r[j]);
i++;
}
while (i < j && r[i] <= r[j])i++;
if (i < j) {
swap(r[i], r[j]);
j--;
}
}
}
void List::QuickSort() {
Stack<pair<int, int> > s;
int first = 1, end = n;
s.Push(make_pair(first, end));
while (!s.Empty()) {
pair<int, int> p = s.Pop();
int pivot = Partition(r, p.first, p.second);
if (p.first < pivot - 1)s.Push(make_pair(p.first, pivot - 1));
if (pivot + 1 < p.second)s.Push(make_pair(pivot + 1, p.second));
}
}
void List::Display() {
for (int i = 1; i <= n; i++)
cout << r[i] << " ";
cout << "\n";
}
int main() {
List L;
while (1) {
int k;
cin >> k;
if (!k) break;
L.InsertR(k);
}
L.Display();
L.QuickSort();
L.Display();
return 0;
}