Insertion sort | Iterative & Recursive

来源:互联网 发布:华帝 方太 老板知乎 编辑:程序博客网 时间:2024/06/06 02:53

插入排序|迭代和递归

给定整数数组,使用插入排序算法排序

插入排序是稳定的,就地排序算法,一次构建最终排序的数组一个项目。在性能方面不是很好,但在实践中比大多数其他简单的O(n2)算法(如选择排序或泡沫排序)更有效。插入排序也用于混合排序,它结合了不同的排序算法来提高性能。我们将在单独的帖子中讨论混合排序。

它也是一种众所周知的在线算法,因为它可以对列表进行排序。在所有其他算法中,我们需要在应用之前将所有要提供给排序算法的元素。但是插入排序允许我们从部分元素集开始,将其排序(称为部分排序集合),如果需要,我们可以插入更多的元素(这些是排序时不在内存中的新的元素集合开始)并对这些元素进行排序。在现实世界中,要排序的数据通常不是静态的,而是动态的。如果在排序过程中插入了一个附加元素,其他算法就不容易响应。但只有这个算法不会中断,并且可以使用附加元素进行良好的响应。

怎么运行的?

这个想法是将数组分成两个子集 - 分类子集和未排序子集。最初排序的子集由索引0上只有一个第一个元素组成。然后对于每个迭代,插入排序从未排序的子集中删除下一个元素,找到它所属于排序的子集中的位置,并将其插入到那里。它重复,直到没有输入元素保留。下面的例子解释一下 -

i = 1 [3 8 5 4 1 9 -2]i = 2 [3 8 5 4 1 9 -2]i = 3 [3 5 8 4 1 9 -2]i = 4 [3 4 5 8 1 9 -2]i = 5 [1 3 4 5 8 9 -2]i = 6 [1 3 4 5 8 9 -2]         [-2 1 3 4 5 8 9]

迭代C ++实现 -

#include <iostream>using namespace std;//对arr执行插入排序[]void insertionSort(int arr[], int n){    //从第二个元素开始(元素在索引0    //已经排序)    for (int i = 1; i < n; i++)     {        int value = arr[i];        int j = i;        //查找排序的子集中的索引j arr [0..i-1]        // where element arr[i] belongs        while (j > 0 && arr[j - 1] > value)         {            arr[j] = arr[j - 1];            j--;        }        //注意,子阵列arr [j..i-1]被转移到        //右边一个位置,即arr [j + 1..i]        arr[j] = value;    }}// 主功能int main(){    int arr[] = { 3, 8, 5, 4, 1, 9, -2 };    int n = sizeof(arr) / sizeof(arr[0]);    insertionSort(arr, n);    //打印排序的数组    printArray(arr, n);    return 0;}

输出:

-2 1 3 4 5 8 9

#include <iostream>using namespace std;//递归函数执行插入排序子阵列arr [i..n]void insertionSort(int arr[], int i, int n){     int value = arr[i];    int j = i;    //查找排序子集中的索引j arr [0..i-1]    //其中元素arr [i]属于    while (j > 0 && arr[j - 1] > value)     {        arr[j] = arr[j - 1];        j--;    }    arr[j] = value;    //注意,子阵列arr [j..i-1]被转移到    //右边一个位置,即arr [j + 1..i]    if (i + 1 <= n)        insertionSort(arr, i + 1, n);}    //打印数组arr的n个元素的功能    void printArray(int arr[], int n)    {        for (int i = 0; i < n; i++)            cout << arr[i] << " ";    }    // 主功能    int main()    {        int arr[] = { 3, 8, 5, 4, 1, 9, -2 };        int n = sizeof(arr) / sizeof(arr[0]);          //从第二个元素开始(元素在索引0        //已经排序)        insertionSort(arr, 1, n - 1);    //打印排序的数组        printArray(arr, n);        return 0;    }

输出

-2 1 3 4 5 8 9

插入排序的最差情况时间复杂度为O(n2)。当阵列反向排序时,最糟糕的情况就是发生。

插入排序的最佳情况时间复杂度为O(n)。最好的情况发生在数组已经排序的时候。

迭代版本使用的辅助空间是O(1)。

原创粉丝点击