理解冒泡排序和插入排序

我们还是用揭扑克牌来理解这两种排序方法,我们需要从小到大来排序,假定最小的牌和最大的牌是未知的,那么对于冒泡排序来讲,过程就是揭起第一张牌,又揭起第二张牌,两张牌比较,留下小的,又揭第三张牌,再与手中的牌比较,以此……那么无论你手中现在是什么牌,你都需要将所有的牌全部揭起来比较之后,才能确定你拿到的是最小的牌,冒出第一个泡,接着还要用同样的方法冒出第二个,第三个……的泡,虽然牌的总数越来越少,但是这样的工作量还是很大的,显然这样做的效率是极低的。最好的情况是牌原本就是有序的,这样你只需要揭牌后比较,不需要交换。
下面先附上冒泡的代码,新手多谢指教

//冒泡法将输入的数由小及大排序并输出
#include<stdio.h>
#include<stdlib.h>
int *input(int n)
{
    int i,*p;
    p=(int*)calloc(n,sizeof(int));
    for(i=0;i<n;i++)
    {
        scanf("%d",p+i);
    }
    return p;
}
void maopao(int *q,int n)
{
    int i,j,temp;
    for(i=0;i<n;i++)
    {
        temp=*(q+i);//拿起来一个数
        //向后遍历最小的
        for(j=i+1;j<n;j++)
        {
            if(*(q+i)>*(q+j))
            {
                 temp=*(q+j);
                 *(q+j)=*(q+i);
                 *(q+i)=temp;
            }
        }
        *(q+i)=temp;
    }
     for(i=0;i<n;i++)
     {
         printf("%d ",*(q+i));

     }


}
int main()
{
    int n;
    printf("输入需要排序的数的个数:");
    scanf("%d",&n);
    maopao(input(n),n);
    return 0;
}

接着插入就比较好理解了,当我们面对一堆需要由小及大排序的牌时,我们不必要固执的找到最小的,而只是一张张揭起来,我们只需要维护好手中的牌保证有序,那么过程就是只要拿新揭起来的牌和手中有序的牌比较,找到位置插进去就可以了 。整个过程需要的时间不仅和牌的总数相关,更与牌原来的顺序相关,最坏情况是,原来的牌是完全倒序的,这样每次都需要移动手中牌的位置进行插入
下面附上代码,新手多谢指教

//用插入排序法实现对输入的数由小及大排序并输出
#include<stdio.h>
#include<stdlib.h>
int *input(int n)
{
    int i,*p;
    p=(int *)calloc(n,sizeof(int));
    for(i=0;i<n;i++)
    {
        scanf("%d",p+i);
    }
    return p;

}
void insert(int* q,int n)
{
    int i,j,temp;
    for(i=1;i<n;i++)//不停的揭牌,直到完
    {
        for(j=i;j>0;j--)
        {
            if(*(q+j)<*(q+j-1))
            {
                temp=*(q+j);
                *(q+j)=*(q+j-1);
                *(q+j-1)=temp;
            }
            else break;
        }

    }
    for(i=0;i<n;i++)
    {
        printf("%d ",*(q+i));
    }
}
int main()
{
    int n;
    printf("输入要排序的个数:\r\n");
    scanf("%d",&n);
    insert(input(n),n);
    return 0;
}
点赞