资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200
输入格式
第一行为一个整数n。第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。
输出格式
输出一行,按从小到大的顺序输出排序后的数列。
样例输入
5
8 3 6 4 9
样例输出
3 4 6 8 9
快排排序方式代码展示
#include<cstdio>
#include<stdlib.h>
using namespace std;
// 该算法查找序列中第一个值的最终位置,并对序列进行一次排序
int location(int *arys,int start,int end)
{
int temp = arys[start];
//以下while中的算法不明白可以画图推算
while(start<end)
{
if(arys[end]>temp)end--;//从尾部向前查找第一个比temp值小的值end
arys[start]=arys[end];//将end值存入偏头部start值
if(arys[start]<temp)start++;//从头部向后查找第一个比temp值大的值start
arys[end]=arys[start];//将start值存入偏尾部end位置
}
arys[start]=temp;//将序列中的第一个值放到最终位置
return start;
}
//递归进行快排排序
int quick_sort(int *arys,int start,int end)
{
//快排未结束标志
if(start<end)
{
int n = location(arys,start,end);//查找序列中第一个值的最终位置
quick_sort(arys,start,n-1);//对序列从start位置到n-1位置进行快排
quick_sort(arys,n+1,end);//对序列从n+1位置到end位置进行快排
}
}
int main()
{
int arys[200]={0},n;//定义并初始化序列arys,定义n值
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&arys[i]);
}
quick_sort(arys,0,n-1);//对arys进行快排
for(int i =0;i<n;i++)
{
printf("%d ",arys[i]);
}
system("pause");
return 0;
}
快排排序方式算法之我的总结
- 快排在递归方式下没有“剪支”会加长运行时间,但大多数情况下快排是个好选择。
- 对scanf函数的格式化输出应注意对int,double,float,char,short的不同使用方式,详细可查看sacnf格式化输出
交换排序方式代码展示
#include<cstdio>
#include<stdlib.h>
using namespace std;
int main()
{
int arys[200]={0},n;//定义并初始化序列arys,定义n值
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&arys[i]);
}
//进行交换排序
int min=0,mid;//min为序列中最小值得位置,mid为交换的中间过渡值
//从第i值开始,将从第i+1个值到n-1值中最小的值与第n个值交换,i从0到n-1.
for(int i=0;i<n;i++)
{
min = i;
//记录i+1到n-1对应arys中最小值的位置
for(int j=i+1;j<n;j++)
{
if(arys[j]<arys[min])
{
min = j;
}
}
if(min!=i)//这里使用剪支法,若min值为i值也就是没有进行上面的记录for循环
{
mid = arys[min];
arys[min] = arys[i];
arys[i] = mid;
}
}
//打印排序后的arys序列
for(int i =0;i<n;i++)
{
printf("%d ",arys[i]);
}
system("pause");
return 0;
}
交换排序算法之我的总结
- 交换排序适用于排序序列的长度不是特别大的序列,通常是50,。
- 对scanf函数的格式化输出应注意对int,double,float,char,short的不同使用方式,详细可查看sacnf格式化输出
- 交换排序过程中记录i+1到n-1对应arys中最小值的位置时要注意min值在不断变化,不要使用i代替min记录最小值的位置