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)。
阅读全文
0 0
- Insertion sort | Iterative & Recursive
- Selection sort | Iterative & Recursive
- Bubble sort | Iterative & Recursive
- Iterative (non-recursive) Merge Sort
- Iterative (non-recursive) Quick Sort
- topological sort python recursive and iterative
- Iterative Method / Recursive Method
- Invert Binary (recursive and iterative)
- Inorder Tree Traversal | Iterative & Recursive
- Preorder Tree Traversal | Iterative & Recursive
- Postorder Tree Traversal | Iterative & Recursive
- Insertion Sort
- Insertion Sort
- insertion sort
- insertion sort
- Insertion Sort
- insertion sort
- insertion sort
- React Component 的生命周期 API
- 数组迭代器(一)-《数据结构预算法》
- gcc -fPIC 选项
- face++人脸识别接口实现原理(一)
- 技巧篇
- Insertion sort | Iterative & Recursive
- 一分钟了解“表示优点/缺点/特性 的词汇”
- (80)高级for循环(尤其是在集合中的简写形式)、可变参数、静态导入
- shell的变量
- 分支管理-解决冲突
- SAX解析XML
- 26.获取系统联系人ContentProvider
- matlab用傅里叶变换实现图像的低通滤波
- Linux常用的命令