#include<iostream>
#include"heap.cpp"
using namespace std;
struct node {
int index;
int num;
};
template<class T>
class sort {
public:
T* arra;
T* temparra;
int length;
sort() {
input();
temparra = new T[length];
cout << "归并排序" << endl;
guisort(arra,0,length-1,temparra);
output();
cout << endl;
cout << "堆排序:" << endl;
dunsort();
output();
cout << endl;
quiksort(0, length - 1, arra);
cout << "快速排序:" << endl;
output();
cout << endl<<"索引排序:" << endl;
indexsort();
cout << endl << "桶排序" << endl;
tongp(length, 10, 3);
}
/*void heapsort(T* arra, int length) {
}*/
void guisort(T* arra, int left,int right,T*temparra) {
if (left < right) {
int mid = (left + right) / 2;
guisort(arra, left, mid,temparra);
guisort(arra, mid + 1, right,temparra);
he2(arra, left, mid, right, temparra);
}
else return;
}
void he(T* arra, int left, int mid, int right,T*temparra) {
int l = left;
int j = left;
int r = mid+1;
for (int i = left;i <= right;i++) {
temparra[i] = arra[i];
}
while (l <= mid && r <= right) {
if (temparra[l] <= temparra[r]) {
arra[j] = temparra[l];
j++;
l++;
}
else {
arra[j] = temparra[r];
r++;
j++;
}
}
while (l <= mid) {
arra[j] = temparra[l];
l++;
j++;
}
while (r <= right) {
arra[j] = temparra[r];
r++;
j++;
}
}
void he2(T* arra, int left, int mid, int right, T* temparra) {
for (int i = left;i <= mid;i++) {
temparra[i] = arra[i];
}
for (int j = 0;j<(right-mid);j++) {
temparra[right - j] = arra[mid + 1 + j];
}
int i = left;
while (left <= right) {
if (temparra[left] <=temparra[right]) {
arra[i] = temparra[left];
i++;
left++;
}
else {
arra[i] = temparra[right];
i++;
right--;
}
}
}
void input() {
cin >> length;
arra = new T[length];
for (int i = 0;i < length;i++) {
cin >> arra[i];
}
}
void output() {
for (int i = 0;i < length;i++) {
cout << arra[i] << " ";
}
}
void dunsort() {
heap<int>a(100);
for (int i = 0;i < length;i++) {
a.insert(arra[i]);
}
a.build();
for (int i = length - 1;i >= 0;i--) {
arra[i] = a.removemax();
}
}
void quiksort(int left, int right, int* arra) {
if (left < right) {
int mid = (right + left) / 2;
int temp = arra[right];
arra[right] = arra[mid];
arra[mid] = temp;
int z=sprt(left, right, arra);
quiksort(left, z-1, arra);
quiksort(z + 1, right, arra);
}
else {
return;
}
}
int sprt(int left, int right, int* arra) {
int l = left;
int r = right;
int temp = arra[r];
while (l < r) {
while (arra[l] <= temp && l < r) {
l++;
}
if (l < r) {
arra[r] = arra[l];
r--;
}
while (arra[r] >= temp && l < r) {
r--;
}
if (l < r) {
arra[l] = arra[r];
l++;
}
}
arra[l] = temp;
return l;
}
void indexsort() {
node* tempa = new node[length];
for (int i = 0;i < length;i++) {
tempa[i].num = arra[i];
tempa[i].index = i;
}
for (int i = 1;i < length;i++) {
node temp = tempa[i];
int j = i - 1;
while (tempa[tempa[j].index].num > temp.num && j >= 0) {
tempa[j + 1].index = tempa[j].index;
j--;
}
tempa[j + 1].index = temp.index;
/*for (int j = i-1;j >=0;j--) {
if (temp.num<tempa[tempa[j].index].num) {
tempa[j + 1].index = tempa[j].index;
}
else {
tempa[j+1].index = temp.index;
break;
}
}*/
}
reazu(tempa);
for (int i = 0;i < length;i++) {
cout << tempa[i].num << " ";
}
}
void reazu(node *tempa) {
for (int i = 0;i < length;i++) {
node temp = tempa[i];
int j = i;
while (tempa[j].index != i) {
tempa[j].num = tempa[tempa[j].index].num;
int in;
in = tempa[j].index;
tempa[j].index = j;
j = in;
}
tempa[j].num = temp.num;
tempa[j].index = j;
}
}
void tongp(int length,int r,int n) {
for (int i = 0;i < n;i++) {
tp(arra, r, i, length);
}
for (int i = 0;i < length;i++) {
cout << arra[i] << " ";
}
}
void tp(int* arra, int r,int i,int length) {
int* temp,*temparra;
temp = new int[r];
for (int x = 0;x < r;x++) {
temp[x] = 0;
}
temparra = new int[length];
for (int j = 0;j < length;j++) {
temparra[j] = arra[j];
}
int t;
for (int k = 0;k < length;k++) {
t = arra[k];
for (int j = 0;j < i;j++) {
t = t / r;
}
t = t % r;
temp[t]++;
}
for (int k = 1;k < r;k++) {
temp[k] = temp[k] + temp[k - 1];
}
for (int k = length-1;k >= 0;k--) {
t = temparra[k];
for (int j = 0;j < i;j++) {
t = t / r;
}
t = t % r;
arra[temp[t] - 1] = temparra[k];
temp[t] = temp[t] - 1;
}
}
};
int main() {
sort<int> a;
return 0;
}