1.排序原理


折半插入排序法是对直接插入排序法的改进,直接插入排序法(),是在前面已排好序的序列中顺序查找要插入的位置,折半插入排序法则是用二查找法找到要插入的位置,然后插入。


2.代码

#include <stdio.h>

void printArray(int a[],int size){  
    printf("数组为:[%d] ",a[0]);  
    for (int i=1;i<size;i++)  
    {  
        printf(" %d ",a[i]);  
    }  
    printf("\n");  
}

void main()
{
	//a[0]为监视哨  
    int a[8]={0,38,65,97,76,13,27,49};  

    for (int i=2;i<=7;i++)  
    {  
        printf(" i=%d  ",i);  
        printArray(a,8);  
//将要插入的数放监视哨
		a[0]=a[i];
		int low=1,high=i-1;
//while循环用二分查找法找到要插入的位置为 high+1
		while(low<=high){
			int m=(low+high)/2;
			if (a[0]<a[m])
			{
				high=m-1;
			}else{
				low=m+1;
			}
		}

		printf("\n%d要插入%d位置",a[0],a[high+1]);
		if (i-1>=high+1)
		{
			printf("\n%d到%d,要向前移一位\n",a[high+1],a[i-1]);
		}
	
//将 high+1到i-1位置数据移到 high+2到i位置		
		for (int j=i-1;j>=high+1;--j)
		{
			a[j+1]=a[j];
		}
// high+1插入要插入的数据
		a[high+1]=a[0];

    }  
    printf("结果 ");  
    printArray(a,8);  

}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.







3结果


i=2  数组为:[0]  38  65  97  76  13  27  49

65要插入65位置 i=3  数组为:[65]  38  65  97  76  13  27  49

97要插入97位置 i=4  数组为:[97]  38  65  97  76  13  27  49

76要插入97位置
97到97,要向前移一位
 i=5  数组为:[76]  38  65  76  97  13  27  49

13要插入38位置
38到97,要向前移一位
 i=6  数组为:[13]  13  38  65  76  97  27  49

27要插入38位置
38到97,要向前移一位
 i=7  数组为:[27]  13  27  38  65  76  97  49

49要插入65位置
65到97,要向前移一位
结果 数组为:[49]  13  27  38  49  65  76  97
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.