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