设置哨兵可以避免越界访问,但排序后数组中的第一个数就是最后一个数;不设置哨兵可以直接得到传入数组的排序结果。

具体例子如下:

先看带哨兵的

#include<stdio.h>
void directsort(int a[],int n){
int i,j;
for(i=2;i<n;i++){
		a[0]=a[i];
	for(j=i-1;a[j]>a[0];j--){
	a[j+1]=a[j];
	}
	a[j+1]=a[0];

}	
} 
int main(){
	int a[10]={0,1,2,4,3,5,6,7,8,9};
	directsort(a,10);
	for(int i=0;i<10;i++){
		printf("%d",a[i]);
	}
	return 0;
}

注意这里的循环条件

for(j=i-1;a[j]>a[0];j--)

可以看出当a[j]=a[0]时,跳出循环,所以既可以防止越界又可以达到与待插入数之前的数比较的目的,一箭双雕,代码简单明了。

再来看看运行结果:

 第一个数是数组中的最后一个数。

再来看看不用哨兵的情况:

采用临时变量t存储 待查值

代码较为麻烦,

运行结果如下:

可以看出,整个数组都参与排序了。 

 

 

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐