二分查找插入排序

本文介绍了一种改进的插入排序算法——二分查找插入排序,该算法通过减少比较次数来提高排序效率。文章详细展示了算法的实现过程,并提供了完整的代码示例及运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
请按任意键继续. . .


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值