第二章 算法入门 合并排序

在第二章中难的算法不多,接下来我会把稍微复杂一点的算法整理一下

#include <iostream>
using namespace std;
void mergeSort(int *A,int left,int mid,int right)
{
    int *L=new int[mid-left+1];
    int *R=new int[right-mid+1];
    int i,j;
    for(i=0;i<mid-left+1;i++)
    {
        L[i]=A[left+i];
    }
    for (j=0; j<right-mid; j++)
    {
        R[j]=A[mid+j+1];
    }
    i=0,j=0;
    int k=left;
    while(i<mid-left+1 && j<right-mid)
    {
        if(L[i]<R[j])
        {
            A[k++]=L[i++];
        }else
        {
            A[k++]=R[j++];
        }
    }
    while (i<mid-left+1)
    {
        A[k++]=L[i++];
    }
    while (j<right-mid)
    {
        A[k++]=R[j++];
    }
    delete []L;
    delete []R;

}
void merge(int *A,int left,int right)
{
    if (left<right)
    {
        int mid=(right-left)/2+left;
        merge(A,left,mid);
        merge(A,mid+1,right);
        mergeSort(A,left,mid,right);
    }

}

int main(int argc, const char * argv[])
{
    int A[]={56,3,5,78,34,74,100,23,11,43,65};
    //int A[]={56,3,5,68};
    merge(A,0,sizeof(A)/sizeof(int)-1);
    for(int i=0;i<sizeof(A)/sizeof(int);i++)
    {
       cout<<A[i]<<"   ";
    }
    cout << "\n";
    return 0;
}

第二章 算法入门 合并排序,布布扣,bubuko.com

时间: 2024-10-24 02:26:19

第二章 算法入门 合并排序的相关文章

算法导论(Introduction to Algorithms )— 第二章 算法入门 — 2.1 插入排序

一.插入排序:INSERTION-SORT 1.适用范围: which is an efficient algorithm for sorting a small number of elements. 对于少量元素的排序,插入排序是一种高效的算法. 2.原理: Insertion sort works the way many people sort a hand of playing cards. We start with an empty left hand and the cards

第二章 算法基础 思考题2-1

package chap02; import static org.junit.Assert.*; import java.util.Arrays; import java.util.Random; import org.junit.Test; /*** * 在归并排序中对小数组采用插入排序 * * @author xiaojintao * */ public class ques2_1 { /** * 归并排序算法 * * @param a * @return */ static void m

第二章 算法基础 思考题2-4(逆序对)

1 package chap02; 2 3 import static org.junit.Assert.*; 4 5 import java.util.Arrays; 6 7 import org.junit.Test; 8 9 public class ques2_4 { 10 /** 11 * 逆序对,将一个序列中的所有逆序对打印输出 12 * 13 * @author xiaojintao 14 * 15 */ 16 static void printReverseOrder(int[]

第二章Python入门

第二章 Python入门 2.1.简介 Python是著名的"龟叔"(Guido van Rossum)在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言 Python的哲学就是简单优雅,尽量写容易看明白的代码,尽量写少的代码.为我们提供了非常完善的基础代码库,覆盖了网络.文件.GUI.数据库.文本等大量内容, 2.1.1.Python适合开发哪些类型的应用呢? 云计算 机器学习 科学运算 自动化运维 自动化测试 爬虫 数据分析 GUI图形化 Web开发等 2.1.2.P

算法之合并排序

上篇文章讲到插入排序算法,是一个标准的增量方法:在排好的子数组后,将元素插入,形成新的数组.今天要介绍的是一种新方法:分治法. 分治法,将原问题划分成n个规模较小而结构与原问题相似的子问题:递归地解决这些子问题,然后再合并其结果,就能得到原问题的解.在每一层递归上都会有三个步骤: 分解:将原问题分解成一系列子问题: 解决:递归地解决各子问题,若子问题足够小,则直接求解: 合并:将子问题的结果合并成原问题的解. 合并排序算法完全依照了上述模式,直观的操作如下: 分解:将n个元素分成各含n/2个元素

算法之合并排序(mergeSort)

合并排序算法在结构上是递归的,采用分治策略:就是将原有的问题划分为 n 个规模较小但结构与原问题相似的子问题,递归地解决这些子问题,然后合并其结果,就得到原问题的解. 合并排序的模式一般如下: 1.分解:将 n 个元素分解为各含 n/2 个元素的两个序列: 2.解决:用分治排序法对两个子序列递归地排序: 3.合并:合并两个已排好序的子序列得到排序结果. 在对子序列递归的过程中,当子序列元素数为1时,递归结束. 合并排序算法的时间复杂度为O(nlgn) 1 void merge(int* a, i

李航老师的《统计学习方法》第二章算法的matlab程序

参考了http://blog.sina.com.cn/s/blog_bceeae150102v11v.html#post % 感知机学习算法的原始形式,算法2.1参考李航<统计学习方法>书中第二章的算法P29 close allclear allclcX=[3,3;4,3;1,1];Y=[1,1,-1];%训练数据集及标记learnRate=1;%学习率Omega=zeros(1,size(X,2))b=0 %% ω和b的初值 i=1;k=0;while 1 if Y(i)*(sum(Omeg

【算法】合并排序

#include <STDIO.H> #include <STDLIB.H> void mergePass(int *ar,int *pr,int s,int size); void merge(int *ar,int *pr,int l,int m,int r); void mergeSort(int *ar,int size) // 合并排序 { int *pr=(int *)malloc(sizeof(int)*size); //动态开辟要排序数组大小的一个新数组 int s

第二章算法总结

递归的概念:直接或者间接地调用自身的算法称为递归算法. 递归让一些复杂的问题变得简单易懂易于分析,如汉诺塔问题和Ackerman函数,在排序快排算法和归并排序算法中也有递归的运用. 汉诺塔: ackerman函数: 递归的缺点:需要不断开拓堆栈空间,占用空间大,可能导致内存溢出,并且运行效率低,不能记录已经计算过的结果,和动态规划比速度慢. 分治法的基本思想: 分治法将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同.递归地解决这些子问题,然后将各个子问题的解合并得