您的位置:首页 > 其它

二分查找插入排序

2013-05-03 14:21 295 查看
1.概念:

先前有复习过插入排序,插入排序的时间复杂度是O(n2),,如果比较的代价远大于交换的代价,则可以使用二分查找插入排序,其时间复杂度也是O(n2),其比较次数比较少

2.实现步骤:

通过折半查找在数组的有序部分找到待插入值应插入的位置,再通过交换法将数据插入的位置。

3代码实现:

public class BinaryInsectionSort

    {

        /// <summary>

        /// 待排序数组

        /// </summary>

        public int[] arr { get; set; }

        /// <summary>

        /// 插入排序

        /// </summary>

        public void InsectionSort()

        {

            if (arr == null)

            {

                Console.WriteLine("未将待排序对象引用设置到实例");

                return;

            }

            for (int i = 1; i < arr.Length; i++)

            {

                int j = i;

                while (j > 0 && arr[j] < arr[j - 1])

                {

                    int temp = arr[j];

                    arr[j] = arr[j - 1];

                    arr[j - 1] = temp;

                    j--;

                }

            }

        }

        /// <summary>

        /// 二分查找插入排序

        /// </summary>

        public void BinaryInsSort()

        {

            if (arr == null)

            {

                Console.WriteLine("未将待排序对象引用设置到实例");

                return;

            }

            for(int i=1;i<arr.Length;i++)

            {

                int left = 0;

                int right = i;

                while (left < right)

                {

                    int mid = (left + right) / 2;

                    if (arr[mid] > arr[i])

                    {

                        right = mid - 1;

                    }

                    else

                    {

                        left = mid + 1;

                    }

                }

                //此时left为要插入的位置

                

                for (int m = i; m > left; m--)

                {

                    int temp = arr[m];

                    arr[m] = arr[m - 1];

                    arr[m - 1] = temp;

                }

            }

        }

    }

4.测试代码

BinaryInsectionSort bis = new BinaryInsectionSort();

            bis.arr = new int[] { 1,5,7,9,2,12,8,13,16,4};

            bis.InsectionSort();

            for (int i = 0; i < bis.arr.Length; i++)

            {

                Console.Write(bis.arr[i]+" ");

            }

            Console.Write("\n");

            bis.arr = new int[] { 1, 5, 7, 9, 2, 12, 8, 13, 16, 4 };

            bis.BinaryInsSort();

            for (int i = 0; i < bis.arr.Length; i++)

            {

                Console.Write(bis.arr[i] + " ");

            }

            Console.Write("\n");

5.运行结果:

1 2 4 5 7 8 9 12 13 16

1 2 4 5 7 8 9 12 13 16

请按任意键继续. . .
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: