插入排序
(一)什么是插入排序
插入排序,是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中,从后向前扫描,找到相应的位置并插入。
如果已经了解了插入排序,那么可以直接进入到总结篇:https://www.cnblogs.com/gdouzz/p/10759399.html
(二)代码实现
1、从第一个元素开始,该元素可以认为已经被排序 2、取出下一个元素,在已经排序的元素序列中从后向前扫描
3、如果该元素(已排序)大于新元素,将该元素移到下一位置 4、重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 5、将新元素插入到该位置后 6、重复步骤2~5
static int[] InsertionSort(int[] arr) { for (var i = 0; i < arr.Length; i++) { var tempValue = arr[i]; var k = i - 1; for (; k >= 0; k--) { if (tempValue < arr[k]) { arr[k + 1] = arr[k]; } else { break; } } arr[k + 1] = tempValue; } return arr; }
(三)时间复杂度分析
//插入排序 //接下来就是 插入排序 //插入排序的过程 比如最坏的情况下 //5,4,3,2,1 //插入排序,最坏时间复杂度,5,4,3,2,1 // 插入排序的概念:从未排序的区间里面,选拿一个到已排序的区间里面(可能要进行,元素的比较和移动)。 //插入排序是一种原地排序的算法。 //插入排序,分为两个已排序区间和未排序区间 //插入排序最坏时间复杂度 //第一趟:5,4,3,2,1 取出一个4出来,4和5比较一下,比5小,4插入到5的前面。 比较了一次,移动了一次。 //第二趟:4,5,3,2,1 取出一个3来,3和5比较一下,3比5小,移动一次,3和4比较一次,移动一次, //第三趟:3,4,5,2,1 取出一个2来,2和5比较一下,移动一次,2和4比较一次,移动一次,2和3比较一下,移动一次。 //第四趟:2,3,4,5,1 取出一个1来,1和5比较一下,移动一次,1和4比较一次,移动一次,1和3比较一次,移动一次,1和2比较一次,移动一次。 //从这个可以看出。比较次数1+2+3+4 交换次数1+2+3+4 都是o(n²),所以最坏情况下是o(n²); //最好情况下,1,2,3,4,5。 //第一趟,取出一个2来,2和1比较一下,2插入到1后面,移动零次 //第二趟,取出一个3来,3和2比较,3插入到后面,移动零次 //第三趟,取出一个4来,4和3比较,4插入到后面,移动零次 //第四趟,取出一个5来,5和4比较,5插入到后面,移动零次 //那比较次数是o(n),移动次数0。
终极目标:世界大同