算法一

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.

原文地址:https://www.cnblogs.com/ttssrs/p/2952412.html