/************************************************************************* > File Name: bin_search.c > Author:heathcliff > Mail:--------------------- > Created Time: 2016年04月05日 星期二 18時12分46秒 ************************************************************************/ #include<stdio.h> #define M 5 /*折半查找法*/ int bin_search(int A[],int n,int key) { int low,high,mid; low = 0; high = n-1; while(low <= high){ mid = (low + high)/2; if(A[mid] == key) return mid; else if(A[mid] < key) low = mid + 1; else high = mid - 1; } /*查找失敗*/ return -1; } /*直接插入排序*/ int insert_sort(int A[],int n) { int i,j,temp; //temp 保存中間值 for(i = 1;i < n; i++){ temp = A[i]; j = i - 1; while(j >= 0 && temp < A[j]){ //找到插入位置 A[j+1] = A[j]; j -- ;//j向後移動 } A[j+1] = temp; //插入temp處的值 } } int main(void) { int A[M]; int i; int n , m; printf("請輸入數組的值:"); for(i = 0;i < M;i++) scanf("%d",&A[i]); printf("\n你輸入的值爲:"); for(i = 0;i < M;i++) printf("[%d]",A[i]); printf("\n"); insert_sort(A,M); for(i = 0;i < M;i++) printf("[%d]",A[i]); printf("\n"); printf("請輸入你要查找的值:\n"); scanf("%d",&n); m = bin_search(A , M , n); if(-1 != m){ printf("排序後,你查找的值在數組的第%d 的位置\n",m); } else printf("查找失敗\n"); return 0; }
分析: 輸入的值爲:10,5,9,8,7 1. 排序 首先 i = 1;temp = A[i] = 5; j = i -1 = 0; 判斷j>= 0 && temp < A[0] = 10 ?,判斷成立 A[1] = A[0] = 10;//值交換 j = -1; 判斷 j> = 0 判斷不成立 A[1] = 5; 如此一來:輸入的值變爲了5,10,9,8,7 第二輪:i = 2; temp = A[2] = 9; j = i - 1 = 1; 判斷 j>=0 && temp <A[1] = 10 ?判斷成立 A[2] = A[1] = 10;//交換值 j = 0; 判斷 j>= 0&& temp < A[0] ?判斷不成立 A[1] = temp = 9; 這麼一搞:輸入值就又變成了:5,9,10,8,7 以此類推,便可將輸入數組有序排列爲 5,7,8,910 2. 折半查找 假設要找的值爲7 , 即key = 7 low = 0; high = 4; mid = 2; A[2] = 8 > key ; high = mid - 1 = 1; mid = 0; A[0] = 5 < 7; low = mid + 1 = 1; mid = 1; A[mid] = key; 找到7的位置