二分法简单排序和查找

原创 2012年03月27日 16:56:58

    二分法排序算法思想简单描述: 在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们 中间的那个元素比,如果小,则对前半再进行折半,否则对后半 进行折半,直到left>right,然后再把第i个元素前1位与目标位置之间 的所有元素后移,再把第i个元素放在目标位置上。
直接看代码。

 public static void DichotomySort(int[] array)
        {
            for (int i = 0; i < array.Length; i++)
            {
                int start = 0;

                int end = i - 1;

                int middle = 0;

                int temp = array[i];

                while (start <= end)
                {
                    middle = (start + end) / 2;

                    if (array[middle] > temp)//要排序元素在已经排过序的数组左边
                    {
                        end = middle - 1;
                    }
                    else
                    {
                        start = middle + 1;
                    }
                }
                for (int j = i - 1; j > end; j--)//找到了要插入的位置,然后将这个位置以后的所有元素向后移动
                {
                    array[j + 1] = array[j];
                }

                array[end + 1] = temp;

            }
        }

    二分法查找。
    查找思想:当数据量很大适宜采用该方法。采用二分法查找时,数据需是排好序的。假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。
代码:

        public static int DichotomySearch(int[] array, int key, int high, int low)
        {
            int middle = 0;

            if (high < low)
            {
                return -1;
            }

            middle = (low + high) / 2;

            if (array[middle] == key)
            {
                return middle;
            }
            else if (array[middle] > key)
            {
                return DichotomySearch(array, key, middle - 1, low);
            }
            else
            {
                return DichotomySearch(array, key,high, middle + 1);
            }
        }

调用:

         static void Main(string[] args)
        {
            int key=0;

            Random random = new Random();

            int[] array = new int[100];

            for (int i = 0; i < 100; i++)
            {
                array[i] = random.Next(0,100);

                if(i==21)
                {
                    key = array[i];
                }
            }

            Dichotomy.DichotomySort(array);

            for (int i = 0; i < array.Length; i++)
            {
                Console.Write(array[i] + ", ");
            }


            int index = Dichotomy.DichotomySearch(array, key, array.Length-1, 0);

            Console.WriteLine();

            Console.WriteLine("查找{0},在array的位置{1}", key, index);

            Console.Read();
        }

代码下载:http://download.csdn.net/detail/yysyangyangyangshan/4177202

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

排序算法之二分法(折半)插入排序算法

基本思想折半插入排序的基本思想与直接插入排序一样,在插入第i(i≥1)个元素时,前面i-1个元素已经排好序。区别在于寻找插入位置的方法不同,折半插入排序是采用折半查找法来寻找插入位置的。 折半查找法...

冒泡,二分法插入,快速排序算法

1.冒泡排序算法 过程: 1.遍历整个数组,每两两相邻的元素进行比较,如$a[$i]>$a[$i+1]则互换位置,每次比较消除一个逆序。 2.每一次循环后,下次再需要循环的次数减少1。 ...
  • fdipzone
  • fdipzone
  • 2013年05月25日 23:39
  • 18322

排序算法——二分法插入排序

简单原理:在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们中间的那个元素比,如果小,则对前半再进行折半,否则对后半进行折半,直到left>right,然后再把第i个元素前1位与目标位置之间...
  • woaic__
  • woaic__
  • 2015年03月27日 21:28
  • 888

c++排序之二分法

1. 二分法查找是一种非常高效的搜索方法,主要原理是每次搜索可以抛弃一半的值来缩小范围。 在离散数学中,如果f(n)是在规模为n的搜索序列中搜索一个元素所需要的比较次数,当n是偶数时,f(n)=...

七大排序算法(冒泡,选择,插入,二分法排序,希尔,快速,合并,堆排序)的java实现(14/8/3更新加入二分排序)

冒泡排序 思路:就是每次将最大或最小的元素放到数组的最后,so easy!时间复杂度为(O(n^2)) public class BubbleSort { public static void bu...

C#实现二分法查找算法

定义 在计算机科学中,二分法查找(binary search)也叫折半查找(half-interval search),又叫对数搜索(logarithmic search)。这是一种在有序数组中...
  • lxt610
  • lxt610
  • 2017年05月07日 22:09
  • 950

C#版本,二分法查找元素是否在一个目标数组中?

//二分法查找元素k下标,如果元素存在,则返回其下标,不存在,返回-1        //调用时候,数组必须是已经从小到大已经排序好的数组        public static int Binar...

C# 快速(二分法)排序

快速(二分法)排序的思想是将数组划分为两边,以某个节点v为界(设这个节点的值为 v),在节点v左边的所有元素都小于 v, 在节点v右边的所有元素都大于v. 这样不停地划分,到最后整个数组就是有序的了...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

查找算法(顺序查找、二分法查找、二叉树查找、hash查找)

http://student.zjzk.cn/course_ware/data_structure/web/chazhao/chazhao9.3.1.5.htm 查找功能是数据处...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二分法简单排序和查找
举报原因:
原因补充:

(最多只允许输入30个字)