归并排序
//归并排序
//跟两个数组合并的算法有异曲同工之妙
#include<bits/stdc++.h>
using namespace std;
#define N 105
int q[N];
int tmp[N]; //存放排序好的临时数组
void merge_sort(int q[],int l,int r)
{
if(l>=r)
return ;
int mid=l+r>>1;
merge_sort(q,l,mid);
merge_sort(q,mid+1,r);
int i=l,j=mid+1;
int k=0;
while(i<=mid&&j<=r)
{
if(q[i]<=q[j])
tmp[k++]=q[i++];
else
tmp[k++]=q[j++];
}
while(i<=mid)
tmp[k++]=q[i++];
while(j<=r)
tmp[k++]=q[j++];
for(int k=0,i=l;i<=r;i++,k++)
q[i]=tmp[k];
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>q[i];
merge_sort(q,0,n-1);
for(int i=0;i<n;i++)
cout<<q[i]<<" ";
return 0;
}
快速排序
重点:先do后i++

//快速排序
//先治后分
#include<bits/stdc++.h>
using namespace std;
#define N 105
int q[N];
void quick_sort(int q[],int l,int r)
{
if(l>=r)
return ;
int x=q[(l+r)>>1];
cout<<"x:"<<x<<endl;
int i=l-1;
int j=r+1;
while(i<j)
{
// while(q[i]<x)
// i++;
// while(q[j]>x)
// j--;
do{
i++;
}while(q[i]<x);
do{
j--;
}while(x<q[j]);
if(i<j)
swap(q[i],q[j]);
}
quick_sort(q,l,j);
quick_sort(q,j+1,r);
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>q[i];
}
quick_sort(q,0,n-1);
for(int i=0;i<n;i++)
{
cout<<q[i]<<" ";
}
return 0;
}
堆排序
//堆排序
#include<bits/stdc++.h>
using namespace std;
#define N 105
int p[N];
void percdown(int p[],int len,int i)
{
int temp=p[i];
for(int k=i*2+1;k<len;k=k*2+1)
{
if(k+1<len&&p[k]<p[k+1])
k++;
if(p[k]>temp)
{
p[i]=p[k];
i=k;
}
else
break;
}
p[i]=temp;
}
void heap_sort(int p[],int n)
{
int i;
for(i=n/2-1;i>=0;i--) //从底向上
percdown(p,n,i);
for(i=n-1;i>=0;i--)
{
swap(p[0],p[i]);
percdown(p,i,0); //从上向下
}
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>p[i];
heap_sort(p,n);
for(int i=0;i<n;i++)
cout<<p[i]<<" ";
return 0;
}

773

被折叠的 条评论
为什么被折叠?



