若对每一个输入实例,一个算法都能停止并给出正确的答案,则说这个算法是正确的。并且,我们说这个正确的算法解决了给定的计算问题。一个不正确的算法,对于某些输入的实例可能不能停止或者停止了但得出的不是正确的答案。
一般来说,我们还是考虑正确的算法,但是一个不正确的算法在其错误率可控的情况下,可能是很有用的。
一般来说,我们还是考虑正确的算法,但是一个不正确的算法在其错误率可控的情况下,可能是很有用的。
先看一下插入排序,它与我们平时打牌时整理手上的牌是相似的。我们在摸牌并整理牌的过程中,开始摸桌上的牌时,左手是空的,然后右手从桌上一张一张拿牌并插入左手中。为了插入左手正确的位置,需要将要插入的牌自左向右地依次与每一张牌比较。排序对于少量元素的排序比较有效。
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