冒泡排序
题目链接:http://47.96.116.66/problem.php?cid=2082&pid=9
题目大意:对n个数排序
排序思想:每次操作吧最大的数移到最后,然后之后不管那个数,处理前n-1个。重复此操作
代码:
/*
我的想法是从小到大排,总共进行n次,首先处理0~n-1将最大数逐渐换到最后一位,然后处理0~n-2,将第二大的数放到倒数第二位....依此类推
对于每一层,比方说第一层,我们是怎么把最大的数放到最后一位的呢?
我们从左开始遍历,每次处理相邻的两个数,如果右边比左边小,就把左边的数换到右边,这样是不是就能把最大的数换到右边了?
冒泡最坏情况:排序 5 4 3 2 1,
*/
#include<stdio.h>
int main()
{
int n;
while (scanf("%d",&n)!=EOF){
int a[100];
for (int i=0;i<n;i++) scanf("%d",&a[i]);//输入
for (int i=0;i<n;i++){//i表示进行第几次
for (int j=0;j<n-1-i;j++){//表示需要遍历到的位置
if (a[j]>a[j+1]){
int t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
for (int i=0;i<n;i++){
printf("%d ",a[i]);
}
printf("\n");
}
return 0;
}
直接插入排序
题目链接:http://47.96.116.66/problem.php?cid=2082&pid=13
题目大意:对n个数从小到大插入排序,并输出排序过程中的比较次数。
排序思想:每新增一个数,在已有数组中找到对应位置(即比前一个大比后一个小的位置)并放入。
代码:
/*
本题插入排序的思路:当前要插入的数x,去遍历当前数组,从右往左(当然可以从左往右但是题目样例的三次是从右往左才能计算出来)
找到第一个大于等于的位置把这个位置之后(不包括该位置)的元素往后挪一个,把当前x放进去
*/
#include<stdio.h>
int main()
{
int t,n,a[2000];
scanf("%d",&t);
for (int tt=1;tt<=t;tt++){
scanf("%d",&n);
scanf("%d",&a[0]);
int ans = 0;
for (int i=1;i<n;i++){
int x,idx = 0;//idx表示当前x要在的位置,由于下一个数在已有数组中从右往左找,所以初始化为最坏情况0
scanf("%d",&x);
for (int j=i-1;j>=0;j--){
ans++;
if (x>=a[j]) {//找要找到第一个>=的位置,那么插在这个数后面即可。找到位置并直接退出
idx = j+1;
break;
}
}
for (int j=i-1;j>=idx;j--){//都右移,把idx这个位置腾出来
a[j+1] = a[j];
}
a[idx] = x;
}
printf("%d\n",ans);
for (int i=0;i<n;i++) printf("%d ",a[i]);
printf("\n");
}
return 0;
}