中国大学MOOC-陈越、何钦铭-数据结构
09-排序1 排序 (25 分)
给定N个(长整型范围内的)整数,要求输出从小到大排序后的结果。
本题旨在测试各种不同的排序算法在各种数据情况下的表现。各组测试数据特点如下:
输入格式:
输入第一行给出正整数N(≤105),随后一行给出N个(长整型范围内的)整数,其间以空格分隔。
输出格式:
在一行中输出从小到大排序后的结果,数字间以1个空格分隔,行末不得有多余空格。
输入样例:
11 4 981 10 -17 0 -20 29 50 8 43 -5
输出样例:
-20 -17 -5 0 4 8 10 29 43 50 981
算法思想:
五种简单排序的练手题。
2019.5.15 ps:发现这样写HeapSort虽然是方便,但是会扰乱排序次序,不符合按序调堆的规则,符合规则版请移步:https://blog.csdn.net/qq_38975493/article/details/90232024
/***************2019.5.12-11:48***********/
/***************2019.5.13-12:04***********/
//09-排序1 排序 3h
//1-BubbleSort-----5.12-11:48-12:00 + 5.13-09:00-09:27
//2-InsertSort-----5.13-09:27-09:50
//3-ShellSort------5.13-09:50-10:35(思绪有点乱,对希尔排序不熟悉)
//4-HeapSort-------5.13-10:35-11:18(对Heap的建立和调整还不熟悉)
//5-MergeSort------5.13-11:18-12:04
#include<stdio.h>
#include<math.h>
void swap(long A[],int i,int j){
long tmp=A[i];
A[i]=A[j];
A[j]=tmp;
}
void BubbleSort(long A[],int N){
int i,j;
for(i=N-1;i>0;i--){
for(j=0;j<i;j++){
if(A[j]>A[j+1]){
swap(A,j,j+1);
}
}
}
}
void InsertSort(long A[],int N){
int i,j;
int tmp;
for(i=1;i<N;i++){
tmp=A[i];
for(j=i;j>0&&tmp<A[j-1];j--){
A[j]=A[j-1];
}
A[j]=tmp;
}
}
void ShellSort(long A[],int N){//Hibbard增量序列 Dk=2的k次方-1 质数序列
int i,j,k,D=1;
int tmp;
while(D<N/2){
if(D*2>N/2) break;
else D=D*2;
}
for(i=D-1;i>0;i=(i+1)/2-1){//增量变化
for(j=i;j<N;j++){//增量组内遍历,插入排序
tmp=A[j];
for(k=j;k>=i&&tmp<A[k-i];k-=i){
A[k]=A[k-i];
}
A[k]=tmp;
}
}
}
void BuildMaxHeap(long A[],int n){
int i,j,k;
for(i=1;i<n;i++){
for(j=i;j>0;j--){
k=(j-1)/2;
if(A[j]>A[k]) swap(A,j,k);
}
}
}
void AdjustHeap(long A[],int n){
int j,k;
for(j=n-1;j>0;j--){
k=(j-1)/2;
if(A[j]>A[k]) swap(A,j,k);
}
}
void HeapSort(long A[],int N){
int i,j;
BuildMaxHeap(A,N);
// for(i=0;i<N;i++) printf("%d ",A[i]);//检测堆
for(i=1;i<=N;i++){
j=N-i;
if(j>0){
swap(A,j,0);
AdjustHeap(A,j);
}
}
}
void MergeSort(long A[],int N){//非递归归并
int i,j,k,m;
int D,l,r,tmp;
for(D=2;D/2<N;D*=2){//归并增量
m=N/D;
if(N%D!=0) m++;
for(i=0;i<m;i++){ //增量D下归并m次
l=i*D;
r=(i+1)*D-1;
r=r>(N-1)?(N-1):r;
if(l==r) continue;
for(j=l+1;j<=r;j++){
tmp=A[j];
for(k=j;k>l&&tmp<A[k-1];k--){
A[k]=A[k-1];
}
A[k]=tmp;
}
}
/* for(p=0;p<N;p++) {
if(p==0) printf("增量%d的归并,次数%d:",D,m);
printf("%d",A[p]);
if(p==N-1) printf("\n");
else printf(" ");
}
*/ }
}
int main(){
int i;
int N;
scanf("%d",&N);
long A[N];
for(i=0;i<N;i++) scanf("%ld",&A[i]);
// BubbleSort(A,N);
// InsertSort(A,N);
// ShellSort(A,N);
// HeapSort(A,N);
MergeSort(A,N);
for(i=0;i<N;i++){
printf("%ld",A[i]);
if(i==N-1) printf("\n");
else printf(" ");
}
return 0;
}