代码改变世界

算法学习之插入排序

2010-10-20 16:02  MichaelYin  阅读(192)  评论(0编辑  收藏  举报

最近开始学习算法方面的东西,用的资料是算法导论,在这里也顺便把学习过程中的心得,体会等,在这里做个总结,并给出自己用c#实现的代码。

说个简单点的例子,就拿算法导论一书中的Poker的例子来说吧。刚开始我们的手上有一张牌,而这张牌肯定是没有排序的大小顺序问题的,桌子上放的牌就是剩下的都没有排序的那些牌,我们将牌从桌子上拿起来,然后从右往左边看,看到一个比我们刚摸上来的牌小的牌后,把手上这个牌右边的牌都朝右边挪动一个位子,然后把刚摸起来的这张牌插入到空出来的这个位置中去。

下面给出实现的代码

       /// <summary>
       /// 插入排序
        /// </summary>
        /// <param name="arrayToSort">需要排序的数组</param>
        public static void InsertionSort(int[] arrayToSort)
        {
            //从第二个元素开始
            for (int j = 1; j < arrayToSort.Length; j++)
            {
                int key = arrayToSort[j];
                int i = j - 1;
                //注意防止索引越界
                while (i > -1 && arrayToSort[i] > key)
                {
                    arrayToSort[i + 1] = arrayToSort[i];
                    i--;
                }
                arrayToSort[i + 1] = key;
            }
        }

本篇讲的是插入排序,插入排序的作用就是将一个本来没有顺序的数组经过处理使其内部元素按照大小顺序统一排列,它的设计思想是采用的增量(incremental)方法,通过循环每次新增一个元素到子数组中,每次将新增这个元素插入到子数组中合适的位置,形成排好序的子数组,这样不停的循环知道数组中的元素全部排序完毕。

算法分析:插入排序的的最坏情况发上在逆序数组的时候,这个时候时间是一个关于n的二次函数。