#include<bits/stdc++.h>
using namespace std;
const int N=1e4;
int tmp[N];
//排序算法总结
void bubble_sort(int a[],int len)
{
for(int i=1;i<=len-1;i++)
{
//第一轮排序的终止点 j=len-1
//j<=len-i
for(int j=1;j<=len-i;j++)
if(a[j]>a[j+1])
swap(a[j],a[j+1]);
}
return ;
}
void insertion_sort(int a[],int n)
{
//直接插入排序
//从第二个位置开始
for(int i=2;i<=n;i++)
{
int tmp=a[i];
int j;
//将大于自己的往后易懂
for( j=i-1;tmp<a[j]&&j>=1;j--)
{
a[j+1]=a[j];
}
//最后j指向的位置为小于或者等于tmp的值,因此 要a[j+1]
a[j+1]=tmp;
}
return ;
}
void merge_sort(int a[],int l,int r)
{
//采用分治的思想
//递归出口
if(l>=r)
return;
//本层处理
int mid=l+r>>1;
merge_sort(a,l,mid);
merge_sort(a,mid+1,r);
//合并
//取两个集合的左端点
//双指针游动
int i=l, j=mid+1;
int k=0;
while(i<=mid&&j<=r)
{
if(a[i]>=a[j]) tmp[++k]=a[j++];
else tmp[++k]=a[i++];
}
while(i<=mid)
tmp[++k]=a[i++];
while(j<=r)
tmp[++k]=a[j++];
//最后将拷贝数组复制到原数组的位置 区间范围为[l,r]
for(int i=l,j=1;i<=r&&j<=k;i++,j++)
a[i]=tmp[j];
return ;
}
//打印
void print(int a[],int n)
{
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
}
//不稳定算法
//快速排序
void quick_sort(int a[],int l,int r)
{
//递归出口
if(l>=r)
return ;
//本层处理
int pivot=a[l];//定义基准
int low = l;//定义low high
int high=r;
while(low<high)
{
while(low<high&&a[high]>=pivot)
high--;
a[low]=a[high];//交换位置
while(low<high&&a[low]<pivot)
low++;
a[high]=a[low];
}
a[low]=pivot;//放基准
quick_sort(a,l,low);
quick_sort(a,low+1,r);
return;
}
//选择排序
void select_sort(int a[],int n)
{
//进行n-1轮
for(int i=1;i<=n-1;i++)
{
int min_num=1e9;
int min_pos;
for(int j=i;j<=n;j++)
{
if(a[j]<min_num)
{
min_num=a[j];
min_pos=j;
}
}
//与当前最小元素交换
swap(a[i],a[min_pos]);
}
}
//
int main()
{
int a[20];
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
//6
//12 33 1 44 2 4
//1
//稳定的排序
int flag;
cin>>flag;
if(flag==1)
//冒泡排序
bubble_sort(a,n);
else if(flag==2)
//插入排序
insertion_sort(a,n);
//
else if(flag=3)
//归并排序
merge_sort(a,1,n);
else if(flag==4)
quick_sort(a,1,n);
else if(flag==5)
select_sort(a,n);
print(a,n);
}
排序算法应用
最新推荐文章于 2024-07-18 11:54:47 发布