第二章 算法基础

2.1 插入排序

C++实现:

#include<iostream>
using namespace std;

void InsertSort(int arr[],int n)
{
    int i,j,key;
    for(i=1;i<n;++i)
    {
        key=arr[i];
        j=i-1;
        while(j>=0&&key<arr[j])
        {
            arr[j+1]=arr[j];
            j--;
        }
        arr[j+1]=key;
    }
}

int main()
{
    int arr[10]={14,25,53,23,2,6,74,34,67,39};
    InsertSort(arr,10);
    for(auto a:arr)
        cout<<a<<' ';
    cout<<endl;
}

 

2.3 分治法

合并操作代码

#include<iostream>
using namespace std;

void Merge(int arr[],int p,int q,int r)
{
    int i=0,j=0;
    int k;
    int n1=q-p+1;
    int n2=r-q;
    int temp[r-p+1];
    for(k=0;k<r-p+1;++k)
    {
        if(i<n1&&j<n2&&arr[p+i]<=arr[q+1+j])
        {
            temp[k]=arr[p+i];
            i++;
        }
        else if(i<n1&&j<n2&&arr[p+i]>arr[q+1+j])
        {
            temp[k]=arr[q+1+j];
            j++;
        }
        else if(i==n1||j==n2)
            break;
    }
    while(j<n2)
    {
        temp[k++]=arr[q+1+j];
        j++;
    }
    while(i<n1)
    {
        temp[k++]=arr[p+i];
        i++;
    }
    for(k=0;k<r-p+1;++k)
        cout<<temp[k]<<' ';
    cout<<endl;
}

int main()
{
    int arr[10]={1,6,9,12,56,2,31,45,67,78};
    Merge(arr,0,4,9);
}

 

2.3.1 合并排序

 

#include<iostream>
using namespace std;
void Merge(int arr[],int p,int q,int r);
void MergeSort(int arr[],int p,int r)
{
    int q;
    if(p < r) //只有一个或无记录时不须排序
    {
		q = (int)((p+r)/2);      //将data数组分成两半
		MergeSort(arr, p, q);   //递归拆分左数组
		MergeSort(arr, q+1, r); //递归拆分右数组
		Merge(arr, p, q, r);    //合并数组
    }
}

/*int main()
{
    int arr[10]={1,6,8,2,4,9,67,34,27,89};
    MergeSort(arr,0,9);
}*/
int main()
{
    int arr[10]={1,23,55,67,89,2,34,57,76,90};
    int k;
    for(k=0;k<10;++k)
    {
        cout<<arr[k]<<" ";
    }
    cout<<endl;
    MergeSort(arr,0,9);
    for(k=0;k<10;++k)
    {
        cout<<arr[k]<<" ";
    }
    cout<<endl;
}

void Merge(int arr[],int p,int q,int r)
{
    int i,j,k;
    int n1=q-p+1;
    int n2=r-q;
    int left[n1],right[n2];
    for(i=0; i<n1;i++)  //对左数组赋值
		left[i] = arr[p+i];
    for(j=0; j<n2;j++)  //对右数组赋值
		right[j] =arr[q+1+j];
    i=j=0;
    k=p;
    while(i<n1&&j<n2)
    {
        if(left[i]<=right[j])
        {
            arr[k++]=left[i++];
        }
        else
        {
            arr[k++]=right[j++];
        }
    }
    while(j<n2)
    {
        arr[k++]=right[j++];
    }
    while(i<n1)
    {
        arr[k++]=left[i++];
    }
}

或者

//Merge.cpp
#include<iostream>
using namespace std;

void Merge(int arr[],int p,int q,int r)
{
    int i=0,j=0;
    int k;
    int n1=q-p+1;
    int n2=r-q;
    int temp[r-p+1];
    for(k=0;k<r-p+1;++k)
    {
        if(i<n1&&j<n2&&arr[p+i]<=arr[q+1+j])
        {
            temp[k]=arr[p+i];
            i++;
        }
        else if(i<n1&&j<n2&&arr[p+i]>arr[q+1+j])
        {
            temp[k]=arr[q+1+j];
            j++;
        }
        else if(i==n1||j==n2)
            break;
    }
    while(j<n2)
    {
        temp[k++]=arr[q+1+j];
        j++;
    }
    while(i<n1)
    {
        temp[k++]=arr[p+i];
        i++;
    }
    for(k=0;k<r-p+1;++k)
        arr[p++]=temp[k];
}

//MergeSort.cpp
#include<iostream>
using namespace std;
void Merge(int arr[],int p,int q,int r);
void MergeSort(int arr[],int p,int r)
{
    int q;
    if(p < r) //只有一个或无记录时不须排序
    {
		q = ((p+r)/2);      //将data数组分成两半
		MergeSort(arr, p, q);   //递归拆分左数组
		MergeSort(arr, q+1, r); //递归拆分右数组
		Merge(arr, p, q, r);    //合并数组
    }
}

/*int main()
{
    int arr[10]={1,6,8,2,4,9,67,34,27,89};
    MergeSort(arr,0,9);
}*/
int main()
{
    int arr[10]={1,23,55,67,89,2,34,57,76,90};
    int k;
    for(k=0;k<10;++k)
    {
        cout<<arr[k]<<" ";
    }
    cout<<endl;
    MergeSort(arr,0,9);
    for(k=0;k<10;++k)
    {
        cout<<arr[k]<<" ";
    }
    cout<<endl;
}

  

时间: 2024-09-16 06:21:52

第二章 算法基础的相关文章

《算法技术手册》一第3章 算法基础

第3章 算法基础 虽说开发软件是为了解决问题,但程序员们往往太执着于是否能够解决问题本身,而不去确认这一问题是否已有解决之法.即便程序员们知道前人已在类似情况下解决了问题,但"已有的解决之法"最终是否适用于特写的问题仍是一个未知数.更重要的是,要找到完全不需要修改或者只需要稍作修改便能解决手头问题的代码并不容易.不同的人对待算法的态度各有千秋.很多人就只是简单地在一本书中或者网站上找个算法,复制代码,运行一次,然后可能还会测试一次,如果结果正确,就开始做下一个任务.但是,在我们看来,这

《算法基础》——第1章 算法基础知识 1.1 方法

第1章 算法基础知识 在开始算法学习之前,你需要一点背景知识.简单地说,首先需要知道的是算法是完成某些事情的方法.它定义了用某个方法执行一个任务的步骤.这个定义看起来足够简单,但是没有人为了做一件十分简单的工作而写算法.没有人写指令来获取数组中的第四个元素.这只是假设这是一个数组定义的一部分,并且你知道怎么去做(如果你知道如何在这个问题中使用编程语言).一般来说,人们只是为了完成复杂的任务而写算法.算法解释了如何找到一个复杂代数问题的答案,如何在一个包含数千条街道的网络中找到最短路径,抑或是如何

JAVA AJAX教程第二章-JAVASCRIPT基础知识

开篇:JAVASCRIPT是AJAX技术中不可或缺的一部分,所以想学好AJAX以及现在流行的AJAX框架,学好JAVASCRIPT是最重要的.这章我给大家整理了一些JAVASCRIPT的基础知识.常用代码和事件汇总. 一.基础知识: 1.document.write(""); 输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:document->html->(head,body) 4.一个浏览器窗口中的DOM顺序是:window->(navigator,

《C# to IL》第二章 IL基础

-2- 如果你真的想要理解C#代码,那么最好的方法就是通过理解由C#编译器生成的代码.本章 和下面两章将关注于此. 我们将用一个短小的C#程序来揭开IL的神秘面纱,并解释由编译器生成 的IL代码.这样,我们就可以"一箭双雕":首先,我们将揭示IL的奥妙,其次,我们将会更 加直观地理解C#编程语言. 我们将首先展示一个.cs文件,并随后通过C#编译器以IL编写一个程序 .它的输出和cs文件是相同的.输出将会显示IL代码.这会增强我们对C#和IL的理解.好吧,不再啰嗦, 这就开始我们的冒险

第二章 Servlet基础

这章我们主要的目标 理解Servlet Servlet的编码和部署 Servlet生命周期 Servlet的配置 Servlet与容器交互    什么是Servlet -是运行在Web服务器或应用服务器上的Java程序 -在Web上创建动态内容的有效而强大的解决方案 -由容器来管理生命周期与Web服务器交互 -由Sun规范了其功能    Servlet的规范组成   Web应用程序  Servlet和HTTPServlet   过滤器  安全  国际化       Servlet生命周期 Ser

初学JavaScript第二章_基础知识

JavaScript的对象都是实例化了的,只可以使用而不能够创建继承于这些对象的新的子类. window对象为所有对象的Parent window对象的主要属性有:Name,Length,Parent,Self,Top,Status,Default Status,Opener,Closed. window对象的主要方法有:Item,alert,blur,close,confirm,open,focus,showModalDialog. Document对象的常用属性:alinkcolor,Anc

&amp;gt; 第二章 NGWS Runtime 技术基础(rainbow 翻译) (转自重粒子空

<<展现C#>> 第二章 NGWS Runtime 技术基础(rainbow 翻译)   出处:http://www.informit.com/matter/ser0000001/chapter1/ch02.shtml 正文: 第二章  NGWS  runtime 技术基础     既然你已经具有了C#全面的印象,我也想让你了解NGWS runtime的全貌.C#依靠由NGWS提供的运行时:因此,有必要知道运行时如何工作,以及它背后所蕴含的概念.    所以,这一章分为两部分--它

《Abaqus GUI程序开发指南(Python语言)》——第二章 Python语言基础2.1 Python语言的特点

第二章 Python语言基础 Abaqus GUI程序开发指南(Python语言)Python语言是一种动态解释型编程语言,其功能强大,简单易学,支持面向对象编程(object-oriented programming),虽然由于其动态性致使程序解释执行速度比编译语言慢,但是随着Python语言的不断优化以及计算机硬件的迅猛发展,Python语言将会受到越来越多用户的关注.Python具有开源.自由等特征.它的简洁性和易用性使程序的开发过程变得简单,特别适用于快速应用程序开发. 本章将简要介绍P

《MATLAB智能算法超级学习手册》一一第1章 MATLAB基础知识

第1章 MATLAB基础知识 MATLAB智能算法超级学习手册MATLAB的基本数据单位是矩阵,它的指令表达式与数学.工程中常用的形式十分相似.用MATLAB解决问题要比用C.FORTRAN等语言简捷得多,并且MATLAB吸收了Maple等软件的优点,从而成为一个强大的数学软件.本章从最基本的运算单元出发,讲述了MATLAB矩阵的表示方法.符号变量的应用.线性方程组的求解,并着重讲解了MATLAB在工程上的简单应用研究. 学习目标: (1)熟练掌握MATLAB矩阵的表示方法: (2)熟练运用符号