歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

二分法查找(折半查找)算法學習筆記

關鍵:數組中的元素必須是已經排好序的。

一維數組,二分法查找:

假如有一組數為1,2,3,4, 5 ,6,7, 8, 9, 10要查給定的值7.可設三個變量low,mid,high分別指向數據的前,中間和後,mid=(low+high)/2.


思路:
1:將low=0,值為1;high=9,值為10(因為數組下標從0開始);mid=(low+high)/2,即等於4,值為32(因為整型會省略小數點);

2:將mid的值與查找的數作比較,如果mid<n(這裡假設要查找的數為n),說明n在mid的後邊,則使得low=mid+1,high不變;如果n<mid,說明n在mid的前邊,則使得high=mid-1,low不變;如果mid==n,你懂的...

3:現在的mid等於4,值為5,查找的范圍為:5,6,7,8,9,10,顯然mid<n,此時mid執行2次循環便等於7,然後輸出mid.

例如: 設計一個程序,提供用戶輸入10個整數並保存到數組中,將整數以從大到小的順序排列,最後通過半分法查找用戶輸入的值並顯示值的序號.(VC++6.0環境)

代碼清單:

  1. /******************************************************** 
  2. ************************半分法查找*********************** 
  3. ********************************************************/ 
  4. #define M 10 
  5. #include <stdio.h> 
  6. int main (void) 
  7.     int a[M]; 
  8.     int n, low, mid, high, number;          /*變量n是讓用戶輸入,變量low表示數組中的前位,mid表示數組中的中間位, 
  9.                                             high表示數組中的後位,number用於表示查找是否成功*/ 
  10.     int i, j, t;            //變量i,j用於對數組元素進行從大到小排序;變量t用於數組元素值的交換                         
  11.  
  12.              
  13.     low = 0; 
  14.     high = M-1; 
  15.     number = 0; 
  16.  
  17.     printf("Please input 10 numbers:\n"); 
  18.     for (n=0; n < 10; n++)           //使用循環讓用戶為數組元素賦值 
  19.     { 
  20.         printf("a[%d]=", n); 
  21.         scanf("%d", &a[n]); 
  22.     } 
  23.      
  24.     for (i=0; i < M-1; i++)<span >          </span>//使用冒泡排序法進行從大到小的排序 
  25.     { 
  26.         for (j=0; j < M-1-i; j++) 
  27.         { 
  28.             if (a[j] < a[j+1])           //a[j+1]代表數組元素的後一個元素 
  29.             { 
  30.                 t = a[j]; 
  31.                 a[j] = a[j+1]; 
  32.                 a[j+1] = t; 
  33.             } 
  34.         } 
  35.     } 
  36.     for (i=0; i < 10; i++)   
  37.     { 
  38.         printf("%d\t", a[i]);           //輸出排序後的數組元素 
  39.     } 
  40.     n = 0; 
  41.     printf("Please input a integer:\n");            //提示用戶輸入要查找的值 
  42.     scanf("%d", &n); 
  43.     <span >//使用二分法進行查找</span> 
  44.     while (low <= high) 
  45.     { 
  46.         mid = (low+high)/2; 
  47.         if (n == a[mid]) 
  48.         { 
  49.             number = 1; 
  50.             break; 
  51.         } 
  52.         else if (a[mid] < n) 
  53.         { 
  54.             high = mid-1; 
  55.         } 
  56.         else 
  57.         { 
  58.             low = mid+1; 
  59.         } 
  60.     } 
  61.     if (number == 1) 
  62.     { 
  63.         printf("the index of %d is: %d\n", n, mid); 
  64.     } 
  65.     else 
  66.     { 
  67.         printf("Program Can't find the number!\n"); 
  68.     } 
/********************************************************
************************半分法查找***********************
********************************************************/
#define M 10
#include <stdio.h>
int main (void)
{
	int a[M];
	int n, low, mid, high, number;			/*變量n是讓用戶輸入,變量low表示數組中的前位,mid表示數組中的中間位,
											high表示數組中的後位,number用於表示查找是否成功*/
	int i, j, t;			//變量i,j用於對數組元素進行從大到小排序;變量t用於數組元素值的交換						

			
	low = 0;
	high = M-1;
	number = 0;

	printf("Please input 10 numbers:\n");
	for (n=0; n < 10; n++)			//使用循環讓用戶為數組元素賦值
	{
		printf("a[%d]=", n);
		scanf("%d", &a[n]);
	}
	
	for (i=0; i < M-1; i++)//使用冒泡排序法進行從大到小的排序
	{
		for (j=0; j < M-1-i; j++)
		{
			if (a[j] < a[j+1])			//a[j+1]代表數組元素的後一個元素
			{
				t = a[j];
				a[j] = a[j+1];
				a[j+1] = t;
			}
		}
	}
	for (i=0; i < 10; i++) 
	{
		printf("%d\t", a[i]);			//輸出排序後的數組元素
	}
	n = 0;
	printf("Please input a integer:\n");			//提示用戶輸入要查找的值
	scanf("%d", &n);
	//使用二分法進行查找
	while (low <= high)
	{
		mid = (low+high)/2;
		if (n == a[mid])
		{
			number = 1;
			break;
		}
		else if (a[mid] < n)
		{
			high = mid-1;
		}
		else
		{
			low = mid+1;
		}
	}
	if (number == 1)
	{
		printf("the index of %d is: %d\n", n, mid);
	}
	else
	{
		printf("Program Can't find the number!\n");
	}


總結:折半查找算法是通過中間值(mid)與要查找的值(n)作比較,每一次比較都可以縮小其的查找范圍;

優點:比較次數少,查找速度快,平均性能好;

缺點:要求待查表為有序表,且插入刪除困難。

Copyright © Linux教程網 All Rights Reserved