1. 循环不变式主要用于帮助我们理解算法的正确性。对于循环不变式,必须证明它的三个性质:
初始化:它在循环第一轮迭代之前,应该是正确的。
保持:如果在循环某一次迭代开始之前它是正确的,那么,在下一次迭代开始之前,它也应该保持正确。
中止:当循环结束时,不变式给了我们一个有用的性质,它有助于表明算法是正确的。
算法分析即指对一个算法所需要的资源进行预测。
RAM模型包含了计算机中常见的指令:算数指令(加减乘除、取余、向下取整、向上取整)、数据移动指令(装入、存储、复制指令)、控制指令(条件和非条件转移、子程序调用和返回指令)。每条指令所需的时间都为常量。
算法的运行时间是指在特定输入时,所执行的基本操作数(步数)。
2. 算法的设计有很多方法,插入排序使用的是增量(incremengtal)方法,在排好子数组A[1..j-1]后,将元素A[j]插入。分治法(divide-and-conquer)是另一种设计策略。
分治模式在每一层递归上都有三个步骤:
分解(divide):将原问题分解成一些列子问题;
解决(conquer):递归地解各子问题,若子问题足够小,则直接求解;
合并(combine):将子问题的结果合并成原问题的解;
#include<iostream>
using namespace std; void Merge(int a[],int left,int center,int right,int n) { int *t=new int[n]; int i = left; int j=center+1; int k=0; while(i<=center && j<= right) { if(a[i]<=a[j]) t[k++] = a[i++]; else t[k++] = a[j++]; } if(i==center+1) { while(j<=right) t[k++]=a[j++]; } else { while(i<=center) t[k++] = a[i++]; } for(i=left,k=0;i<= right;i++,k++) a[i]=t[k]; delete []t; } void MSort(int a[],int left,int right) { if(left < right) { int center = (left+right)/2; MSort(a,left,center); MSort(a,center+1,right); Merge(a,left,center,right,right-left+1); } } int main() { int intArray[10]={2,346,4,768,4,23,45,68,4,0}; MSort(intArray,0,9); for(int i = 0; i < 10; i++) cout << intArray[i] << endl; }
合并排序的运行时间为nlgn,插入排序为n^2.