代码改变世界

[算法学习笔记]直接插入排序笔记

2014-05-13 20:48  hellenism  阅读(165)  评论(0编辑  收藏  举报

直接插入排序概念:

带排元素放在elem[0...n-1]中,初始化时,elem[0]自成1个有序区,无序区为elem[1...n-1],从i=1起,到i=n-1,依次将elem[i]插入有序区[0...n-1]中

 

直接插入排序算法步骤:

1.在当前有序区域R[1,i-1]中查找R[i]的正确插入位置K(1<=K<=i-1)

2.将R[K,i-1]中的记录均向后移动

3.移动后腾出K位置,插入R[i]

 

(最坏)时间复杂度:O(n^2)

空间复杂度:O(1)

 

        /// <summary>
        /// 步骤:(正序)
        /// 1.从带排序列中获取待排元素,记录
        /// 2.依次比较有序集合中的各个元素(从有序集合中的最后一个开始向前比较)
        /// 3.如果待插入元素小与比较元素,则比较元素向后移动一个位置
        /// 3.否则结束内层循环,此时的下标j+1则为待排元素的位置
        /// 
        /// 关键点:
        /// 1.第一个元素被当做是有序序列,故从i=1开始排序
        /// 2.待排元素与有序元素的比较是从有序序列的最后一个元素开始比
        /// 3.在有序序列中,一旦遇到比等排元素小的,则本次比较即为停止,j+1就是待排元素位置
        /// 
        /// [0][1][2][3][4][5][6]
        /// 
        /// 88 16 8 27 24 49 78
        /// 
        /// 88 16 8 27 24 49 78
        /// 
        /// 16 88 8 27 24 49 78
        /// 
        /// 8 16 88 27 24 49 78
        /// 
        /// 8 16 27 88 24 49 78
        /// 
        /// 8 16 24 27 88 48 78
        /// 
        /// 8 16 24 27 48 88 78
        /// 
        /// 8 16 24 27 49 78 88
        /// </summary>
        /// <param name="elements"></param>
        static void InsertSort(int[] elements)
        {
            int i;
            int j;

            for (i = 1; i < elements.Length; i++)
            {
                //记录需要插入的数据(带排元素)
                int standBy = elements[i];

                // 内层循环是遍历有序序列
                // 从有序序列中的最后一个开始比较
                for (j = i - 1; j >= 0; j--)
                {
                    // 如果待排元素比有序元素小,则向后移动
                    if (standBy < elements[j])
                        elements[j + 1] = elements[j];
                    else // 一旦条件不成立,则视为找到目标位置
                        break;
                }

                elements[j + 1] = standBy;
            }
        }
        static void Main(string[] args)
        {
            int[] elements = { 88, 68, 25, 6, 12, 57, 78, 12 };

            // 调用直接插入排序
            InsertSort(elements);
            
            foreach(int e in elements)
            {
                Console.Write( e + " ");
            }
        }