插入排序类:直接插入排序和希尔排序

//myself test 插入排序类 

#include<stdio.h>
//1.直接插入排序:(调试一次就成功啦!鼓励一下,当然是在自己确认过逻辑没错的情况下)
void InsertSort(int a[],int n){
	int i=0,j=0;
	for(i=1;i<n;i++){//数组元素个数从1~n.其中0号位置放置哨兵,共n+1个元素,被排序数为n个 
		if(a[i+1]<a[i]){
             a[0]=a[i+1];
		     //for(j=i;j>0;j--){这一行错了,不应该用for循环,直到最后j为0,这样后移就不对。应该是当大于a[0]的时候就立刻退出,第二次这个错
			 j=i;//要变动的位置赋值给j 
			 while(a[j]>a[0]){ //用到循环先考虑while循环   
				 a[j+1]=a[j];
                 j--;
			 }   
             a[j+1]=a[0];
		} 
	}
} 

//2.希尔排序,又增量缩小排序。
//希尔排序是不稳定的,如 3   5  10  8  7  2  8  1  20  6
/*d=2 分成2组  (3  10  7  8  20) 和(5  8  2  1  6) 第一组的8在第二组的后面 
排序后(3  7  8  10  20)和 (1  2  5  6  8)          现在是第一组的8在第二组前面了   这里不稳定 */ 

//搞半天原来是这个地方没有声明,直接把ShellSort提到前面了,逗 
void Shell(int a[],int n,int d){//假设增量已定,其实就是增量已定的直接插入排序 
    int i=0,j=0; 
    for(i=d+1;i<n;i++){
	    if(a[i]<a[i-d]){//要非常注意很有可能不注意写成自减1 
		    a[0]=a[i];
		    j=i-d;
		    while(j>=0 && a[j]>a[0]){  //要注意,为什么这里要检测j>=0,而直接插入排序不要
			    a[j+d]=a[j];//这个没错 
			    //j--;这里居然一开始写成了j--,事实上这是不对的,应该每次减去d 
			    j-=d; 
			}
			//如果直到最前面一个菜插入,那么这个循环下来,j必定是负的,这一点需要注意 
			a[j+d]=a[0];
		}
	} 
}

void ShellSort(int a[],int n){//这里的d是增量 
	int d=n/2;
	while(d>=1){
	    Shell(a,n,d);
	    d=d/2;
	} 
} 


void print(int a[],int n){
    for(int i=1;i<n;i++){
	   printf("%d\t",a[i]);
	}
    printf("\n");
}
int main(){
   int a[9]={0,3,1,5,7,2,4,9,6};
   InsertSort(a,8);
   print(a,8); 
   int b[9]={0,3,1,5,7,2,4,9,6};
   ShellSort(b,9);
   print(b,9);
   getchar();
   return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值