#include<iostream>
#include<string>
#include<cmath>
#include<list>
#include<algorithm>
using namespace std;
int a[205];
int t[205];
int n = 0,ans;
void mergeSort(int* a,int x,int y,int* t){
if(y-x<=1) return;
int m = x + (y-x)/2;
int p = x,q = m,i=x;
mergeSort(a,x,m,t);
mergeSort(a,m,y,t);
while(p<m||q<y){
if(q>=y||(p<m&&a[p]<=a[q])) t[i++] = a[p++];
else {
t[i++] = a[q++];
ans += m-p;
}
}
for(i = x;i < y;i++) a[i] = t[i];
}
void quickSort(int* a, int left,int right){
if(left>right) return;
int i = left,j = right,temp,t;
temp = a[left];
while(i!=j){
while(a[j]>=temp&&i<j) j--;
while(a[i]<=temp&&i<j) i++;
if(i<j){
t = a[j];a[j]=a[i];a[i]=t;
}
}
a[left] = a[i];
a[i] = temp;
quickSort(a,left,i-1);
quickSort(a,i+1,right);
}
void insertSort(int * a,int n){
int b[n+1];
for(int i = 1;i <= n;i++) b[i]=a[i-1];
int temp,i,j;
for(i = 2;i <= n;i++){
if(b[i]<b[i-1]){
b[0] = b[i];
for(j = i-1;b[0]<b[j];j--)
b[j+1]=b[j];
b[j+1] =b[0];
}
}
for(int i = 1;i <= n;i++) a[i-1]=b[i];
}
void swap(int x,int y){
int t = a[x];a[x] = a[y];a[y] = t;
}
void shiftDown(int x){
bool f = false;
int t=x;
while(x*2<=n&&!f){
if(a[x]<a[x*2]) t = x*2;
else t = x;
if(x*2+1<=n){
if(a[t]<a[x*2+1]) t = x*2+1;
}
if(t!=x){
swap(t,x);
x = t;
}else {
f = true;
}
}
}
void create(){
for(int i = n/2;i>=1;i--)
shiftDown(i);
}
void heapSort(){
if(n>1){
swap(1,n);
n--;
shiftDown(1);
}
}
int main(){
int n;
cin>>n;
for(int i = 1;i <= n;i++){
cin>>a[i];
}
// mergeSort(a,0,n,t);
// quickSort(a,0,n);
// insertSort(a,n);
create();
heapSort();
for(int it = 1;it <= n;it++){
cout<<a[it]<<" ";
}
cout<<endl;
cout<<ans;
return 0;
}
归并,快排,插入,堆各种排序实现
猜你喜欢
转载自blog.csdn.net/JingleLiA/article/details/80977689
今日推荐
周排行