冒泡排序和直接插入排序

冒泡排序

题目链接: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
 
int main()
{
    int n;
    while (scanf("%d",&n)!=EOF){
        int a[100];

        for (int i=0;ia[j+1]){
                    int t = a[j];
                    a[j] = a[j+1];
                    a[j+1] = t;
                }
            }
        }

        for (int i=0;i

直接插入排序

题目链接:http://47.96.116.66/problem.php?cid=2082&pid=13

题目大意:对n个数从小到大插入排序,并输出排序过程中的比较次数。

排序思想:每新增一个数,在已有数组中找到对应位置(即比前一个大比后一个小的位置)并放入。

代码:

/*
本题插入排序的思路:当前要插入的数x,去遍历当前数组,从右往左(当然可以从左往右但是题目样例的三次是从右往左才能计算出来)
找到第一个大于等于的位置把这个位置之后(不包括该位置)的元素往后挪一个,把当前x放进去
*/

#include

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=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

 

 

 

你可能感兴趣的:(CJSYZX相关)