Chinaunix首页 | 论坛 | 博客
  • 博客访问: 164944
  • 博文数量: 56
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 593
  • 用 户 组: 普通用户
  • 注册时间: 2014-02-18 09:59
文章分类

全部博文(56)

文章存档

2019年(1)

2018年(26)

2016年(1)

2015年(6)

2014年(22)

我的朋友

分类: Java

2014-03-24 22:03:09

说明
如果却搜寻的资料分布平均的话,可以使用插补(Interpolation)搜寻法来进行搜寻,在搜寻
的对象大于500时,插补搜寻法会比二分搜寻法来的快速。
解法
插补搜寻法是以资料分布的近似直线来作比例运算,以求出中间的索引并进行资料比对,如果
取出的值小于要寻找的值,则提高下界,如果取出的值大于要寻找的值,则降低下界,如此不
断的减少搜寻的范围,所以其本原则与二分搜寻法是相同的,至于中间值的寻找是透过比例运
算,如下所示,其中K是指定要寻找的对象, 而m则是可能的索引值:




点击(此处)折叠或打开

  1. /**
  2.  * @author:      吴永行
  3.  * @dateTime:     2014-3-24 下午9:25:31
  4.  * @description:     
  5.  *
  6.  */
  7. package 经典算法大全;

  8. import java.util.Random;
  9. import java.util.Scanner;

  10. public class _44_插补搜寻法 {

  11.     /**
  12.      * @author:      吴永行
  13.      * @dateTime:     2014-3-24 下午9:25:31
  14.      * @description:     
  15.      * @param args
  16.      *
  17.      */

  18.     static final int MAX = 10;

  19.     static final void swap(int[] a, int i, int j) {
  20.         int t;
  21.         t = a[i];
  22.         a[i] = a[j];
  23.         a[j] = t;
  24.     }

  25.     public static void main(String[] args) {

  26.         int number[] = new int[MAX + 1];
  27.         int i, find = 0;
  28.         Random random = new Random();
  29.         System.out.format("排序前:");
  30.         for (i = 0; i < MAX; i++) {
  31.             number[i] = Math.abs(random.nextInt()) % 100;
  32.             System.out.format("%d ", number[i]);
  33.         }
  34.         quicksort(number, 0, MAX);
  35.         System.out.format("数列:");
  36.         for (i = 1; i <= MAX; i++)
  37.             System.out.format("%d ", number[i]);
  38.         System.out.format("\n输入搜寻值:");
  39.         Scanner in = new Scanner(System.in);
  40.         find = in.nextInt();
  41.         if ((i = intsrch(number, find)) >= 0)
  42.             System.out.format("\n找到数值于索引%d ", i);
  43.         else
  44.             System.out.format("\n找不到数值");
  45.         System.out.format("\n");

  46.     }

  47.     /**
  48.      * @author:      吴永行
  49.      * @dateTime:     2014-3-24 下午9:28:17
  50.      * @description:     
  51.      * @param number
  52.      * @param find
  53.      * @return
  54.      *
  55.      */
  56.     private static int intsrch(int[] number, int find) {
  57.         double low, mid, upper;
  58.         low = 0;
  59.         upper = MAX - 1;
  60.         while (low <= upper) {
  61.             mid = (upper - low) * (find - number[(int) low])
  62.              / (number[(int) upper] - number[(int) low]) + low;
  63.             if (mid < low || mid > upper)
  64.                 return -1;
  65.             if (find < number[(int) mid])
  66.                 upper = mid - 1;
  67.             else if (find > number[(int) mid])
  68.                 low = mid + 1;
  69.             else
  70.                 return (int) mid;
  71.         }
  72.         return -1;
  73.     }

  74.     /**
  75.      * @author:      吴永行
  76.      * @dateTime:     2014-3-23 下午9:41:21
  77.      * @description:     
  78.      * @param number
  79.      * @param i
  80.      * @param j
  81.      *
  82.      */
  83.     private static void quicksort(int[] number, int left, int right) {
  84.         int q;
  85.         if (left < right) {
  86.             q = partition(number, left, right);
  87.             quicksort(number, left, q - 1);
  88.             quicksort(number, q + 1, right);
  89.         }
  90.     }

  91.     /**
  92.      * @author:      吴永行
  93.      * @dateTime:     2014-3-23 下午9:42:02
  94.      * @description:     
  95.      * @param number
  96.      * @param left
  97.      * @param right
  98.      * @return
  99.      *
  100.      */
  101.     private static int partition(int[] number, int left, int right) {
  102.         int i, j, s;
  103.         s = number[right];
  104.         i = left - 1;
  105.         for (j = left; j < right; j++) {
  106.             if (number[j] <= s) {
  107.                 i++;
  108.                 swap(number, i, j);
  109.             }
  110.         }
  111.         swap(number, i + 1, right);
  112.         return i + 1;
  113.     }

  114. }


阅读(827) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~