插入排序的总结

数据结构排序算法之——插入排序(Insert Sort)

代码很多地方借鉴了  http://my.csdn.net/MoreWindows 他的思想,

本人认为该作者已经写的很好了,只是在他的基础上加入了一些自己的理解和说明

如果涉及到版权的问题,请联系我的邮箱,我会尽快删除

插入排序想关链接:

维基百科:https://zh.wikipedia.org/wiki/%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F

百度百科:http://baike.baidu.com/view/396887.htm

参考博客 :http://blog.csdn.net/morewindows/article/details/6665714

 最近一次更新时间 2016年09月15日 

更新类型:

  更新了二叉查找插入

插入排序的基本思想(由大到小):

最开始时,将第一个位置(也就是数组中下标为0的元素)的元素看做有序的,将后面的元素与它进行比较,如果后面的比前面的大,则将后面的和前面的交换位置

…………

依次在后面的无序的元素中选取第一个无序数与前面已经有序的元素进行比较找到一个合适的位置(如果从有序的位置从前向后比较,则找到第一个不大于它的数,如果从后向前找,是找第一个不小于它的数),将插入位置到待有序结尾的位置依次向后移动一个位置,将带插入元素插入当前有序的数组,形成新的有序数组

代码:

void Insert_Sort(int array[], int arrayLen)

{

    // 由大到小

    // 将第一个元素(0)视为有序的,则第二个元素(1)开始

    for (int i = 1; i < arrayLen; ++i)

    {

        // 从开始比较

        for (int j = 0; j < i; ++j)

        {

            // 找到第一 不大于 当前数据的值

            if (array[j] < array[i])

            {

                int tempInsertNum = array[i];

                int k = i;

               

                // 将所有的元素向后移动一个

                while(k>=0&& k>j)

                {

                    array[k] = array[k - 1];

                    --k;

                }

                // 将元素插入数组中

                array[k] = tempInsertNum;

                // 已经成功插入 ,执行下一次外循环

                break;

            }

        }

    }

}

一种该进的思想是: 在从有序的后面开始比较,每比较一次向后移动一次

直到找到合适的插入位置结束

void Insert_Sort_Improve1(int array[], int arrayLen)

{

    // 由大到小

    // 将第一个元素(0)视为有序的,则第二个元素(1)开始

    for (int i = 1; i < arrayLen; ++i)

    {

        // 如果是array[i]<= array[i-1] 则前面的数都比array[i] 大,则当前有序

        if (array[i] > array[i - 1])

        {

            int tempInsertNum = array[i];

            int j = i - 1;

            while (j >= 0 && array[j] < tempInsertNum)

            {

                // 一边比较,一边移动

                array[j + 1] = array[j];

                -- j;

            }

 

            // 多执行了一次 -- j

            array[j + 1] = tempInsertNum;

        }

    }

}

还有一种改进思想是使用值交换来代替数据的移动

void Insert_Sort_Improve2(int array[], int arrayLen)

{

    for (int i = 1; i < arrayLen; ++i)

    {

        // 如果是array[j] >= array[j+1] 则前面的数都比array[j+1] 大,则当前有序

        for (int j = i - 1; j >= 0 && array[j + 1] > array[j]; -- j)

            Swap_IntVal(array + j + 1, array + j);

    }

}

还有一种利用二分查找插入位置的插入排序

源码如下;

void Insert_binary_Sort(int array[], int arrayLen)

{

    int InsertPos = 0;

    int i = 1;

    while (i < arrayLen)

    {

        int InsertNum = array[i];

        InsertPos = binary_search(array, 0, i - 1, array[i]);

 

        for (int j = i - 1; j >= InsertPos; --j)

        {

            array[j + 1] = array[j];

        }

        array[InsertPos] = InsertNum;

 

        ++i;

    }

}

二分查找:

int binary_search(int array[], int low, int height, int searchKey)

{

    while (low <= height)

    {

        int mid = low + (height - low) / 2;

 

        if (searchKey > array[mid])

        {

            low = mid + 1;

        }

        else if (searchKey < array[mid])

        {

            height = mid - 1;

        }

    }

    return low;

}

详细的代码:代码地址应该会选择放在github,但是最近我对github的操作还不是很熟悉

原文地址:https://www.cnblogs.com/bkcarlos/p/5860817.html