深入浅出《算法导论》1

在开始研究算法之前,先看一个排序的问题,将一序列数字按照非降序进行排列。输入<a1 ,a2,a3,a4,a5,a6>一列数字,使得排序后的输出结果满足<a1,a2,a3,a4,a5,a6>其中a1<=a2<=a3<=a4<=a5<=a6,满足该序列的一个具体的输入称为该排序问题的一个实例。一般滴,一个问题的实例由满足该问题陈述中的限制条件、并计算出该问题的一个结果的所有输入构成的。对于一个具体的应用采用哪一种排序算法最合适,取决于待排序的元素的长度和已被排序的程度、所使用的存储设备,如主存和磁盘等等。
若对每一个输入实例,一个算法都能停止并给出正确的答案,则说这个算法是正确的。并且,我们说这个正确的算法解决了给定的计算问题。一个不正确的算法,对于某些输入的实例可能不能停止或者停止了但得出的不是正确的答案。
 一般来说,我们还是考虑正确的算法,但是一个不正确的算法在其错误率可控的情况下,可能是很有用的。
先看一下插入排序,它与我们平时打牌时整理手上的牌是相似的。我们在摸牌并整理牌的过程中,开始摸桌上的牌时,左手是空的,然后右手从桌上一张一张拿牌并插入左手中。为了插入左手正确的位置,需要将要插入的牌自左向右地依次与每一张牌比较。排序对于少量元素的排序比较有效。

package sort;

/**
 * 插入排序算法分析
 */
public class insertionSort {

     public static void printArray( int[] array) {
            for ( int ar : array) {
                System. out.println( "排序前序列为:" + ar);
           }
     }

     public static void insertionSortProcess() {
            int[] array = { 5, 2, 4, 6, 1, 3 }; // 该排序问题的一个实例
            printArray(array);
            // j自左向后从数组第二个元素位置向右移动,
            // array[j+1..n]对应待排序的多个元素,
            // array[j]对应待插入的元素
            for ( int j = 1; j < array. length; j++) {
                 int key = array[j];
                 int i = j - 1;
                 // array[0..j-1]已经由小到大排好序,
                 // 其中由array[j-1]这个元素开始,每个元素相继向右移动一格,直到array[j]找到正确的位置,将其插入
                 while (i >= 0 && array[i] > key) {
                     array[i + 1] = array[i]; // 右移
                     i = i - 1; // 依次向左移动,继续与key进行比较
                }
                array[i + 1] = key; // 找到正确的位置
           }
           System. out.println( "---------------");
            printArray(array);

     }

     public static void main(String[] args) {
            insertionSortProcess();
     }
}
插入排序算法的分析:插入排序的过程时间开销与输入的序列的大小有关,在相同的长度的输入序列下,则跟他们已排列的程序有关。算法所需的时间与输入规模有关,可以将一个程序的运行时间表示为输入的函数。
一个算法的运行时间是指在特定输入时所执行的基本操作步骤数。这个基本操作步骤独立于具体的机器,是一个抽象的概念,我们执行每一行伪代码都要花费相同的一定量的时间,虽然每次具体的时间可能不同,但是都是一个常量值。
假定执行第i行代码所花费的时间是都是常量C(i)。这与RAM模型是一致的观点,RAM(单处理器,随机存储器)模型中,指令都一条一条的顺序执行,没有并发操作,这与稍后讨论的并行模型不同。
 
 
接下来请关注“深入浅出《算法导论》2”系列文章。
 
关注我的微博: http://weibo.com/yuwentao886
 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值