堆排序和插入排序都使用algorithm中的函数
# include <bits/stdc++.h>
using namespace std;
vector<int> A;
vector<int> A_origin;
vector<int> seq;
int N;
bool isInsertSort = false;
bool isHeapSort = false;
bool isSameArray() {
for(int i = 1;i <= N;++i)
if(A[i] != seq[i])
return false;
return true;
}
void insertSort() {
for(int i = 2;i <= N;++i){
isInsertSort = (isSameArray() && i != 2);
sort(A.begin() + 1, A.begin() + i + 1);
if(isInsertSort){
cout << "Insertion Sort\n";
for(int k = 1;k <= N;++k)
cout << A[k] << (k == N?"\n":" ");
return;
}
}
}
void heapSort() {
make_heap(A.begin()+1, A.end());
for(int i = N;i > 1;--i){
isHeapSort = (isSameArray() && i != N);
pop_heap(A.begin()+1, A.begin()+1 + i);
if(isHeapSort){
cout << "Heap Sort\n";
for(int k = 1;k <= N;++k)
cout << A[k] << (k == N?"\n":" ");
return;
}
}
}
int main() {
cin >> N;
A.resize(N+1);
seq.resize(N+1);
for(int i = 1;i <= N;++i)
cin >> A[i];
for(int i = 1;i <= N;++i)
cin >> seq[i];
A_origin = A;
insertSort();
A = A_origin;
heapSort();
return 0;
}
自己写函数建堆并进行堆排序
# include <bits/stdc++.h>
using namespace std;
vector<int> A;
vector<int> A_origin;
vector<int> seq;
int N;
bool isInsertSort = false;
bool isHeapSort = false;
bool isSameArray() {
for(int i = 1;i <= N;++i)
if(A[i] != seq[i])
return false;
return true;
}
void insertSort() {
for(int i = 2;i <= N;++i){
isInsertSort = (isSameArray() && i != 2);
if(A[i] < A[i-1]){
A[0] = A[i];
int pos = lower_bound(A.begin(), A.begin()+i-1, A[0]) - A.begin();
for(int j = i-1;j >= pos;--j)
A[j+1] = A[j];
A[pos] = A[0];
}
if(isInsertSort){
cout << "Insertion Sort\n";
for(int k = 1;k <= N;++k)
cout << A[k] << (k == N?"\n":" ");
return;
}
}
}
void downAdjust(int low, int high) {
int i = low;
int j = 2 * i;
while(j <= high) {
if(j + 1 <= high && A[j+1] > A[j])
j++;
if(A[j] > A[i]) {
swap(A[i], A[j]);
i = j;
j = 2 * i;
} else
break;
}
}
void creatMaxHeap(){
for(int i = N/2;i >= 1;--i)
downAdjust(i, N);
}
void heapSort() {
creatMaxHeap();
for(int i = N;i > 1;--i){
isHeapSort = (isSameArray() && i != N);
swap(A[1], A[i]);
downAdjust(1, i-1);
if(isHeapSort){
cout << "Heap Sort\n";
for(int k = 1;k <= N;++k)
cout << A[k] << (k == N?"\n":" ");
return;
}
}
}
int main() {
cin >> N;
A.resize(N+1);
seq.resize(N+1);
for(int i = 1;i <= N;++i)
cin >> A[i];
for(int i = 1;i <= N;++i)
cin >> seq[i];
A_origin = A;
insertSort();
A = A_origin;
heapSort();
return 0;
}