算法起步之插入排序

原文:算法起步之插入排序

        趁着过年这段时间,我将算法导论这本书看了一遍,感觉受益匪浅。着这里也根据算法导论中所涉及到的算法用java实现了一遍。

        第一篇我们就从排序开始,插入排序的原理很简单,就像我们玩扑克牌时一样。如果手里拿的牌比他前一张小,就继续向前比较,知道这张牌比他前面的牌打时候就可以插在他的后面。当然在计算机中我们相应的也需要将对比过的牌向后移一位才可以。

        这里直接给出算法,相信很多程序员都感觉有些程序比我们的自然语言都要好理解。

public class Sort {
	public void sort(int[] s){
		if(s.length<1){
			return ;
		}
		for (int i = 1; i < s.length; i++) {
			int key =s[i];
			int j=i-1;
			while(j>=0&&s[j]>key){
				s[j+1]=s[j];
				j--;
			}
			s[j+1]=key;
		}
	}
	public static void main(String[] args) {
		Sort s=new Sort();
		int[] st =new int[]{7,5,3,4,2,1};
		s.sort(st);
		for (int i = 0; i < st.length; i++) {
			System.out.println(st[i]);
		}
	}
}

          他的时间复杂度是o(n*n),是原址的(任何时候都需要常数个二外的元素空间存储数据而归并排序就是非原址的)

         友情提示:转载请注明出处【作者:idlear  博客:http://blog.csdn.net/idlear

时间: 2024-10-25 12:23:55

算法起步之插入排序的相关文章

算法起步之快速排序

原文:算法起步之快速排序   快速排序一听这个名字可能感觉很快,但是他的算法时间复杂度最坏情况却跟插入排序是一样的.之所以成为快速排序是因为他的平均效率比堆排序还要快,快速排序也是基于分治思想与归并排序差不多,但是快速排序是原址的,直接在原数组操作不需要再开辟新的存储空间.快速排序的思想很简单,就是选定一个关键字k将原数组分成两份g1与g2,g1中所有的元素都比k小或者相等,而g2中所有的数据都比k大或者等于,这样对g1与g2分别进行快速排序,最终我们得到的就是一个有序的数组.代码中的sort方

算法起步之Bellman-Ford算法

原文:算法起步之Bellman-Ford算法            从这篇开始我们开始介绍单源最短路径算法,他是图算法之一,我们前面说的贪心,图的遍历,动态规划都是他的基础,单源最短路径其实说的就是图中节点到节点的最短路径.就像我们使用百度地图从哪到哪一样,找出最近的距离,而单源最短路径问题不只是两点之间的路径,他有很多的变形,像单目的地最短路径问题,单节点对最短路径问题,所有节点对最短路径问题,最短路径的最优子结构问题.         在介绍这类算法之前我们先规定节点的基本属性,我们规定节点

算法起步之动态规划LCS

原文:算法起步之动态规划LCS             前一篇文章我们了解了什么是动态规划问题,这里我们再来看动态规划另一个经典问题,最长公共子序列问题(LCS),什么是子序列,我们定义:一个给定序列将其中的0个或者多个元素去掉之后得到的序列就是他的子序列.例如序列x包含(a,b,c,b,d,a,b)那么序列y(b,c,d,b)就是x的一个子序列.公共子序列则是两个序列的公共的子序列,而最长公共子序列则是从两个序列的公共子序列中挑选出长度最长的子序列.            我们用我们说的动态规

算法起步之拓扑排序

原文:算法起步之拓扑排序         拓扑排序是图中所有节点的一种线性次序,首先拓扑排序是对有向无环图来说的,如果不满足这个条件则无法拓扑排序,拓扑排序就是遵循一定的规则对节点的排序,规则就是假设在图中有一条边是从a节点出发指向b节点,则在拓扑排序中b节点不可能排在a的前面.其实就是一直寻找入度为0的节点.我们也可以理解成b的完成必须依赖a的完成,a没有完成则b无法进行,其实这样理解的话我们先前说的线性规划也是一种拓扑排序,像我们平时的起床过程也是一种拓扑排序.          拓扑排序的

算法起步之广度优先搜索

原文:算法起步之广度优先搜索           广度优先搜索算法是图的基本算法之一,图是用来保存过对多的关系的数据结构,相对于树一对多的关系更为复杂,所以难度也会比树结构难一点,图的存储一般有连接表表示跟链接矩阵表示,相比来说链接矩阵的方式更为常用,也就是用数组来存储.而广度优先搜索算法其实就是图的遍历过程,数组的遍历大家都会,数组的遍历我们是按照下标的顺序来遍历的,而图的遍历也有自己的方式,图是多对多的关系,我们可以按照各个节点直接的关联关系来遍历他们,这样便衍生出来深度优先跟广度优先,广度

算法起步之并查集(不相交集合数据结构)

原文:算法起步之并查集(不相交集合数据结构)          在java中经典的数据结构基本都给实现好了,我们可以直接调用,但是并查集这种数据结构却没有很好的替代工具,在这里我们我们自己去实现并查集数据结构.首先我们先要去了解什么是并查集.并查集也是一种非常经典常用的数据结构.像求连通子图跟我们下面要研究的最小生成树问题都会用到并查集.并查集就是能够实现若干个不相交集合,较快的合并和判断元素所在集合的操作.不相交集合:一个不相交集合维护了一个不相交动态集合{s1,s2,s3--}我们用一个代表

算法起步之Prim算法

原文:算法起步之Prim算法            prim算法是另一种最小生成树算法.他的安全边选择策略跟kruskal略微不同,这点我们可以通过一张图先来了解一下.            prim算法的安全边是从与当前生成树相连接的边中选择一条最短的一条,并且该边是应是生成树与生成树外一点的连接.            所以我们prim算法用汉字描述的过程应为:1初始化2构造最小优先队列,将所有节点都加入到最小优先队列中,所有节点的key设置为无穷大,开始节点设置成0.3循环,直到队列为空{

内部排序算法:直接插入排序

基本思想 假设待排序的记录存放在数组R[0..n-1]中.初始时,R[0]自成1个有序区,无序区为R[1..n-1]. 从i=1起直至i=n-1为止,依次将R[i]插入当前的有序区R[0..i-1]中,生成含n个记录的有序区. 算法实现 直接插入排序算法,Java实现,代码如下所示: 01 public abstract class Sorter { 02 public abstract void sort(int[] array); 03 } 04 05 public class Straig

我的Java开发学习之旅------&amp;gt;Java经典排序算法之二分插入排序

一.折半插入排序(二分插入排序) 将直接插入排序中寻找A[i]的插入位置的方法改为采用折半比较,即可得到折半插入排序算法.在处理A[i]时,A[0]--A[i-1]已经按关键码值排好序.所谓折半比较,就是在插入A[i]时,取A[i-1/2]的关键码值与A[i]的关键码值进行比较,如果A[i]的关键码值小于A[i-1/2]的关键码值,则说明A[i]只能插入A[0]到A[i-1/2]之间,故可以在A[0]到A[i-1/2-1]之间继续使用折半比较:否则只能插入A[i-1/2]到A[i-1]之间,故可