插入排序
来源:互联网 发布:家庭千兆网络 编辑:程序博客网 时间:2024/05/07 06:05
核心思想
插入排序是一种通过移动整个数组来交换元素的算法
假设有N个元素,那么它由N-1趟排序组成。
它基于这样的事实: 它将数组分成两个部分,第0~ P-1 个元素是有序的,第P到N-1是无序的。
每一趟排序,我们选择第P个位置的元素,即右边部分取出一个数放到0-~P-1中的一个正确位置。
我们比较这个元素和第0~P-1的元素,在一个循环中一个一个比较,比它大的就后移,遇到比它小的就跳出循环就把这个元素放到比它小的数的后面:
实现算法
思考步骤:
1. 数组划分两个部分
2. P从1到N-1,选择P位置的元素
3. 比较第P个元素和前面0~P-1个元素,有必要就移动
4. 交换tmp和第j个元素(循环结束后的j)
public void insertionSort(int[] A){ if(A==null||A.length<1) return; int len=A.length; int j; for(int P;P<len;P++){ int tmp=A[P]; for(j=P;j>0&&A[j-1]>tmp;j--){ A[j]=A[j-1]; } A[j]=tmp; }}
性能分析
时间复杂度
最坏 O(N^2)
最好 O(N) ,最好情况就是所有元素都是有序的,那么插入排序中的内部循环就永远不满足判断条件,所以不会移动元素。
实际为:
tmp=A[P];A[j]=tmp; //j其实就是P,因为没有进入循环
平均复杂度:
O(N^2)
空间复杂度
O(1) 没有使用额外的空间。
稳定性
稳定的, 因为每次比较的是遇到比它小的才交换位置,而且其实是数组整体往后移动来交换。 跟它的值一样的元素与它的相对顺序必然是保持不变的。
举例 {3,4,5,12,5}
排序后:
{3,4,5,5,12}
0 0
- 插入排序-【插入排序】
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 组合模式
- string效率异常之高,以下比较
- c++string入门
- 线性表-链式存储结构
- rqnoj 2 开心的金明
- 插入排序
- LeetCode 529.Minesweeper & 515.Find Largest Value in Each Tree Row
- 关于i/o端口和i/o内存的区别
- 各种Hash函数和代码
- Java和.net那个好?
- Java使用notify()、wait()、和notifyAll()来进行线程间的通信
- 文件上传攻防解析
- 如何创建对象的数组
- CXF框架入门实例