给出N个整数,对着N个整数进行排序
Input
第1行:整数的数量N(1 <= N <= 50000) 第2 - N + 1行:待排序的整数(-10^9 <= A[i] <= 10^9)
Output
共n行,按照递增序输出排序好的数据。
Input示例
5 5 4 3 2 1
Output示例
1 2 3 4 5
简单插入排序:
#include <iostream>
using namespace std;
int a[50001];
int main()
{
int i,n,j;
scanf("%d",&n);
for(i=1; i<=n; i++)
{
scanf("%d",&a[i]);
}
for(i=2; i<=n; i++)
{
if(a[i]<a[i-1])
{
a[0]=a[i];
a[i]=a[i-1];
for(j=i-2; a[0]<a[j]; j--)
{
a[j+1]=a[j];
}
a[j+1]=a[0];
}
}
for(i=1; i<=n; i++)
{
printf("%d\n",a[i]);
}
return 0;
}
希尔排序:
#include <iostream>
using namespace std;
int a[50001];
int main()
{
int n,i,j,gap,temp;
cin>>n;
for(i=0; i<n; i++)
{
cin>>a[i];
}
for(gap=n/2; gap>0; gap/=2)
{
for(i=gap; i<n; i++)
{
for(j=i-gap; a[j]>a[j+gap]&&j>=0 ; j-=gap)
{
temp=a[j];
a[j]=a[j+gap];
a[j+gap]=temp;
}
}
}
for(i=0; i<n; i++)
cout<<a[i]<<"\n";
return 0;
}
快速排序:
#include <iostream>
using namespace std;
int a[50001];
int Partition(int a[],int low,int high) //对给定数组进行一次快排
{
a[0]=a[low];
int pivotkey=a[low]; //每次指定序列的第一个元素为哨兵
while(low<high)
{
while(low<high&&a[high]>=pivotkey)
high--;
a[low]=a[high];
while(low<high&&a[low]<=pivotkey)
low++;
a[high]=a[low];
}
a[low]=a[0];
return low; //返回快排后哨兵的位置
}
void Qsort(int a[],int low,int high) //递归地对哨兵两侧的序列进行快排
{
int pivotloc;
if(low<high)
{
pivotloc=Partition(a,low,high);
Qsort(a,low,pivotloc-1);
Qsort(a,pivotloc+1,high);
}
}
int main()
{
int i, n;
cin>>n;
for(i=1; i<=n; i++)
{
cin>>a[i];
}
Qsort(a,1,n);
for(i=1; i<=n; i++)
cout<<a[i]<<"\n";
return 0;
}
简单选择排序:
#include <iostream>
using namespace std;
int a[50001];
int main()
{
int n,i;
cin>>n;
for(i=0; i<n; i++)
cin>>a[i];
for(i=0; i<n-1; i++)
{
int k=i,j,t;
for(j=i+1; j<n; j++)
{
if(a[j]<a[k])
{
k=j;
}
}
if(k!=i)
{
t=a[k];
a[k]=a[i];
a[i]=t;
}
}
for(i=0; i<n; i++)
cout<<a[i]<<"\n";
return 0;
}
堆排序:
#include <iostream>
using namespace std;
typedef struct
{
int a[50001];
int length;
}Sqlist;
void HeapAdjust(Sqlist &L,int s,int m) //将序列a[s....m]调整为大根堆,大根堆即为根节点比每个子节点都大的完全二叉树
{
int rc=L.a[s]; //记录调整起点的结点值
for(int j=s*2; j<=m; j*=2)
{
if(j<m&&L.a[j]<L.a[j+1]) //找到要目前根节点的两个子节点的最大值并标记下标
j++;
if(rc>=L.a[j]) //如果已经是大根堆形式的三个结点则跳出循环
break;
L.a[s]=L.a[j]; //不是的话就交换结点值使之成为大根堆
s=j;
}
L.a[s]=rc;
}
void CreatHeap(Sqlist &L) //将序列转化为大根堆的函数
{
int n=L.length;
for(int i=n/2; i>0; i--) //层层转化大根堆
{
HeapAdjust(L,i,n);
}
}
void HeapSort(Sqlist &L) //将大根堆排序为按下标值顺序增长的序列
{
CreatHeap(L);
for(int i=L.length; i>1; i--)
{
int x=L.a[1];
L.a[1]=L.a[i];
L.a[i]=x;
HeapAdjust(L,1,i-1);
}
}
int main()
{
Sqlist L;
int n;
cin>>n; L.length=n;
for(int i=1; i<=n; i++)
cin>>L.a[i];
HeapSort(L);
for(int i=1; i<=n; i++)
cout<<L.a[i]<<"\n";
return 0;
}
归并排序:
#include <iostream>
using namespace std;
int a[50001];
void Merge (int R[], int T[], int low,int mid,int high) //将R[low,mid]和R[mid+1,high]归并排序到T数组中
{
int i=low,j=mid+1,k=low;
while(i<=mid && j<=high)
{
if(R[i]<=R[j])
T[k++]=R[i++];
else
T[k++]=R[j++];
}
while(i<=mid)
T[k++]=R[i++];
while(j<=high)
T[k++]=R[j++];
}
void MSort(int R[],int T[],int low,int high)
{
int S[50001];
if(low==high)
T[low]=R[low];
else
{
int mid=(low+high)/2;
MSort(R,S,low,mid); //使R[low,mid]有序 ,结果存储到S[low,mid]中
MSort(R,S,mid+1,high); //使R[mid+1,high]有序,结果存储到S[mid+1,high]中
Merge(S,T,low,mid,high); //将S[low,mid],和S[mid+1,high]归并排序合并到T数组中
}
}
void Mergesort(int a[],int length)
{
MSort(a,a,1,length);
}
int main()
{
int n;
cin>>n;
for(int i=1; i<=n; i++)
cin>>a[i];
Mergesort(a,n);
for(int i=1; i<=n; i++)
cout<<a[i]<<"\n";
return 0;
}