排序算法:插入排序,折中插入排序

Posted MICBB

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法:插入排序,折中插入排序相关的知识,希望对你有一定的参考价值。

1??插入排序:把序列分为有序和无序两部分排序,如果是升序,则无序和有序比较小则有序右移直到找到大于有序值然后替换,大于则不变,有序++;继续比较;

     主要用途:直接插入算法实现简单,在序列基本有序的情况下,移动和比较的次数少,所以有序情况下优先插入排序

     复杂度与稳定度:属于稳定的排序方法,时间复杂度 O(n^2) 空间复杂度 O(1);

 

C/C++:

 1 #include <iostream>
 2 
 3 int *InsertSort(int *Array, int size)
 4 {
 5     if (Array == nullptr)
 6         return nullptr;
 7 
 8     //思想分为有序和无序部分
 9     int unorder = 0, order = 0, temp;
10 
11     for (unorder = 1; unorder < size; unorder++)
12     {
13         //保存比较的值
14         temp = *(Array + unorder);
15         for (order = unorder - 1; order >= 0 && temp < *(Array + order); order--)
16         {
17             //升序,无序值小于有序值则有序值右移,直到找到比有序小的或order==0;
18             *(Array + order + 1) = *(Array + order);
19         }
20         //不移动则赋值给自身,或者找到插入位置,赋值插入位置后的位置;
21         *(Array + order + 1) = temp;
22     }
23     return Array;
24 }
25 
26 
27 int main()
28 {
29 
30     int a[] = {17, 46, 32, 87, 58, 9, 50, 38};
31     int size = sizeof(a) / sizeof(int);
32     InsertSort(a, size);
33 
34     std::for_each(std::begin(a), std::end(a), [](int &value)
35     { std::cout << value << "\t"; });
36     std::cout << std::endl;
37     return 0;
38 }

 

2??折中插入排序:与插入排序的区别,寻找插入位置由从右到左遍历比较变为二分法查找比较(减少比较次数)

     主要用途:同插入排序

     复杂度与稳定度:同插入排序(虽然比较次数少了)

 

C/C++:

#include <iostream>


//折中插入排序,和插入排序的区别就是改变 无序在有序中查找位置的方式,前者是折中查找(减少比较次数),后者是从右到左遍历比较
int *HalfInsertSort(int *Array, int size)
{
    if (Array == nullptr)
        return nullptr;

    //思想分为有序和无序部分
    int unorder = 0, order = 0, temp;

    //计算机中两数之和除以2取整之后值靠左(个人理解),(low+hight)/2 最终位置保存在low位置;
    int low = 0, hight = 0, mid = 0;

    for (unorder = 1; unorder < size; unorder++)
    {
        //保存比较的值
        temp = *(Array + unorder);

        //寻找位置,终止条件位置出现负值之前- -,(升序)
        for (low = 0, hight = unorder - 1; hight >= low;)
        {
            mid = (low + hight) / 2;
            if (temp < *(Array + mid))
            {
                hight = mid - 1;
            } else
            {
                low = mid + 1;
            }
        }

        //找到插入点low,移动
        for (order = unorder - 1; order >= low; order--)
        {
            //升序,无序值小于有序值则有序值右移,直到找到比有序小的或order==0;
            *(Array + order + 1) = *(Array + order);
        }

        *(Array + low) = temp;
    }
    return Array;
}


int main()
{

    int a[] = {17, 2, 3, 5, 4, 4, 34, 43, 323, 434, 234, 21, 46, 32, 87, 58, 9, 50, 38};
    int size = sizeof(a) / sizeof(int);
    InsertSort(a, size);

    std::for_each(std::begin(a), std::end(a), [](int &value)
    { std::cout << value << "\t"; });
    std::cout << std::endl;
    return 0;
}

 

以上是关于排序算法:插入排序,折中插入排序的主要内容,如果未能解决你的问题,请参考以下文章

排序算法之冒泡选择插入排序(Java)

排序算法之冒泡选择插入排序(Java)

7种基本排序算法的Java实现

《算法》笔记 3 - 选择排序插入排序希尔排序

排序算法学习(直接插入排序,希尔排序,选择排序,堆排序,冒泡排序)

三大基础排序算法(冒泡排序,选择排序,插入排序)