八大排序之插入排序
Posted 随性如风
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了八大排序之插入排序相关的知识,希望对你有一定的参考价值。
一、基本思想
插入排序是一种简单直观的排序方法,基本思想是从待排记录中选择一个元素插入到已经有序的序列中。当待排记录中所有的元素都插入到有序序列中后,整个排序也就完成了。
二、实现方法
大致思路:从无序序列中选取一个元素,在有序序列中找到合适的位置i,有序序列中i及其以后的元素后移,给待插元素让位。插入当前元素。
详细操作:
1.用一个数组a[]来模拟待排记录,数组长度为n。a[0]不存放待排元素,做监视哨。
2.假设对a[i]进行插入排序,那么将整个数组从逻辑上划分成两部分,1 ~ (i-1)为有序序列,(i) ~ (n-1)为无序序列。
3.默认a[1]在有序序列中,此时有序序列只有一个元素a[1],而无序序列为a[2] ~ a[n-1],所以进行第一次插入排序是从i = 2开始的。
4.现插入a[i],做a[0] = a[i]。从有序序列的末尾开始查找刚好小于a[0]的元素的位置,于此同时在查找的过程中将那些大于a[0]的元素逐个后移,为新插入的元素腾出位置。
5.对无序序列中的每一个元素进行上述插入排序,整个排序过程就完成了。
三、实现代码
1.测试数组为1-100的随机整数数组。
2.测试工具类 点击查看
package sort; import sort.util.*; public class InsertSort implements ISort{ public void sort(int[] a) { for(int i = 2; i < a.length; i++) { //0号位置不存放排序的元素,1号位默认为已经排序号的元素,从2号开始插入 a[0] = a[i]; //a[0]做哨兵和暂存空间 int j; for(j = i - 1; a[0] < a[j]; j-- ){ //从有序序列的最后一位开始向前,找到合适的插入位置,a[0] < a[j]还可以进行越界的判断,有两个作用 a[j+1] = a[j]; //移动元素位置,给将插入的元素空位 } a[j+1] = a[0]; //已找到合适位置,插入元素 } } public static void main(String[] args) { int[] array = RandomArrayGenerator.getRandomArray(100 , 30); SortTestHelper.test(new InsertSort() , array); } }
测试结果:(a[0]不计入待排记录,查看结果时忽略第一个元素)
四、算法分析
时间复杂度:O(n2)
空间复杂度:O(1)
稳定性:稳定
插入排序简单直观,占用空间少,但时间随n增长较快,所以适合元素较少的待排记录
本文个人编写,水平有限,如有错误,恳请指出,欢迎讨论分享。
以上是关于八大排序之插入排序的主要内容,如果未能解决你的问题,请参考以下文章