1. 程式人生 > >折半插入排序法---排序演算法(二)

折半插入排序法---排序演算法(二)

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);  

}





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