折半插入排序

折半插入排序相对于插入排序来说次数能少一点,因为插入时,前方元素已排序好,所以只用和中间那个元素比较,比中间元素小,那就从0——中间元素这一段继续和中间元素比较,依次类推下去。右边也一样。


代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 折半查找插入排序
{
    class Program
    {
        static void Main(string[] args)
        {


            // 待排序的数组
            int[] array = { 1, 0, 2, 5, 3, 4, 9, 8, 10, 6, 7 };
            binaryInsertSort(array);
            // 显示排序后的结果。
            Console.WriteLine("排序后: ");
            for (int i = 0; i < array.Length; i++)
            {


                Console.Write(array[i] + " ");

            }
            Console.ReadKey();
        }

        /// <summary>
        /// 插入排序
        /// </summary>
        /// <param name="array">要排序的数组</param>
        private static void binaryInsertSort(int[] array)
        {
            for (int i = 1; i < array.Length; i++)
            {
                int temp = array[i];
                int low = 0;//左方元素下表为0
                int high = i - 1;//我们要插入元素下标为i,所以已排序数组最右边下标为i-1
                while (low <= high)
                {
                    int mid = (low + high) / 2;//前方已排序数组1分为2

                    /*如果新加入元素比中间元素小,那就是使
                     * high=mid-1,而low不变,意思就是只用在左边
                     * 进行查找了
                     */
                    if (temp < array[mid])
                    {
                        high = mid - 1;
                    }  
                        /*新插入元素比中间元素大,那么就只用在右方查找了
                         * 让low=mid+1,而high不变
                         */
                    else
                    {
                        low = mid + 1;
                    }
                }

                /*上方代码执行完毕之后low的前方应该插入我们想要
                 * 插入的元素,此时low后方元素整体后移一位
                 * 移动完之后low这个位置把我们要加进去的元素放进去
                 * 就OK了
                 */
                for (int j = i; j >= low + 1; j--)
                {
                    array[j] = array[j - 1];
                }
                array[low] = temp;
            }
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值