折半插入排序法---排序演算法(二)
阿新 • • 發佈:2019-01-08
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