算法笔记:(一)插入排序:直接插入排序(Straight Insertion Sort)
2017-04-18 00:38
302 查看
小记:人最痛苦的事情,就是我原本可以...上学的时候对编程不感兴趣,没有学好专业知识,刚刚毕业工作了一段时间后,同学推荐后差点进入腾讯,我连最基本的Main函数参数都不明白。在济南干了三年,成了不大不小的项目经理,后来朋友说济南没有前途,我也头脑发热的去北漂,第一个面试是华为,上级题简单的二进制反转,但是面试不好,简历里面写的熟练掌握面向对象,面试官问我,怎么用C来进行面向对象设计,我一时没有想起来,最后没有通过最后的面试。后来我想Struct等等都可以表示对象啊,函数用指针。后来的工作也是不大不小的公司,虽然工作表现不错,但心里总是有那么一点点遗憾。如果上学的时候,学的扎实一些,如果毕业之后补习一下,如果面试多准备。人啊,没有那么多如果,虽然我可能进入后被35退休,累的吐血。上学的时候,基本上都是马马虎虎的过来了。现在三十而立,只是立了家,毕业之后在上海济南北京晃荡了七年后,回到了自己的家乡,在一个四五线的城市,干着软件开发,下班后比较闲,没事的时候就特别心慌,所以打算把大学时候没有学好的知识再好好的弄明白。
言归正传,直接插入排序的基本思想:
将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,比较前面元素之间大小,交换元素保证子序列有序。子序列有序后,再加入后面的元素,成为一个新的序列,然后遍历这个新的序列,调整加入的元素在合适的位置,使这个新的序列有序。直至整个序列有序为止。排序后相等的元素前后顺序不会发生变化,所以这种排序方法是稳定。 时间复杂度:O(n2)。
假设有一个数组 int[] list={15,8,45,6,8,12,7,9,2},对它进行排序,每次加入新的元素,用“()”括起来表示。排序的顺序如下图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201704/a0ba9d89a7b279defabfd376984eb618.png)
以前一直从事.NET开发,最近可能接受Java的项目,所以这次用java代码学习,所以一些理解不到位的地方,请多不吝指教。
参考链接地址:http://blog.csdn.net/hguisu/article/details/7776068
言归正传,直接插入排序的基本思想:
将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,比较前面元素之间大小,交换元素保证子序列有序。子序列有序后,再加入后面的元素,成为一个新的序列,然后遍历这个新的序列,调整加入的元素在合适的位置,使这个新的序列有序。直至整个序列有序为止。排序后相等的元素前后顺序不会发生变化,所以这种排序方法是稳定。 时间复杂度:O(n2)。
假设有一个数组 int[] list={15,8,45,6,8,12,7,9,2},对它进行排序,每次加入新的元素,用“()”括起来表示。排序的顺序如下图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201704/a0ba9d89a7b279defabfd376984eb618.png)
以前一直从事.NET开发,最近可能接受Java的项目,所以这次用java代码学习,所以一些理解不到位的地方,请多不吝指教。
//直接插入排序 public class Straight_Insertion_Sort_Main { /*将一个记录插入到已排序好的有序表中, * 从而得到一个新,记录数增1的有序表。 * 即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入, * 直至整个序列有序为止。*/ public static int recorde=0;//显示交换次数,和算法无关 public static int forIndex=0;//循环次数统计,和算法无关无效值 public static void print(int[] list,int change) { int len=list.length; System.out.print("排序次数="+recorde+" "); recorde++; for(int index=0;index<len;index++) { if(list[index]==change) { System.out.print("("+list[index]+") "); } else { System.out.print(list[index]+" "); } if(index==len-1) { System.out.println(""); } } } public static void Sort(int[] list) { int len=list.length; print(list,list[0]); forIndex++; for(int index=1;index<len;index++) { if(list[index]<list[index-1]) { int last=list[index]; list[index]=list[index-1]; list[index-1]=last;//将最大的数放在最后 print(list,last); int reindex=index-1; while(reindex>0)//同时向前遍历,保证数组的有序 { forIndex++; if(list[reindex-1]>last) { list[reindex]=list[reindex-1]; list[reindex-1]=last; print(list,last); } else// { break; } reindex--; } } } } public static void main(String[] args) { // TODO Auto-generated method stub int[] list={15,8,45,6,8,12,7,9,2}; Sort(list); } }
参考链接地址:http://blog.csdn.net/hguisu/article/details/7776068
相关文章推荐
- 【数据结构----笔记3】插入排序算法之【直接插入排序】
- 算法笔记--直接插入排序
- [算法学习笔记]直接插入排序笔记
- 算法系列-------直接插入排序(InsertionSort)
- 算法不会,尚能饭否之排序——直接插入排序(Insert sort)
- 直接插入排序:改进算法---折半插入排序
- 直接插入排序 direct insertion sort
- 白话经典算法系列之二 直接插入排序的三种实现
- 直接插入排序的两个算法示例
- 白话经典算法系列之二 直接插入排序的三种实现
- python算法实践1-直接插入排序
- 白话经典算法系列之二 直接插入排序的三种实现
- 排序算法之直接插入排序
- 直接插入排序(Insertion Sort)
- 白话经典算法系列之二 直接插入排序的三种实现
- 排序算法之一 直接插入排序
- 常用算法总结之排序(七)---直接插入排序
- 每日一算法之直接插入排序的原理及实现
- Sort——直接插入排序
- 插入排序算法学习——算法导论学习笔记