算法导论第二章C++实现归并算法排序

归并算法排序的思想算法导论中讲的还算比较清楚、

#include<iostream>
using namespace std;
void guibing(int *_array,int p,int q,int r);
void merge_sort(int *_array,int p,int r);
int main()
{   int a[8]={2,4,5,7,1,2,3,6};
    int j1=0;
    int j2=7;
    merge_sort(a,j1,j2);
   int i=0;
   for(;i<8;i++)
	   cout<<a[i]<<' ';
   cout<<endl;
    //int length;
	//length=sizeof(a)/sizeof(int);
	//cout<<length<<endl;
	//cout<<sizeof(int)<<endl;
	//cout<<sizeof(a)<<endl;
	system("pause");
   return 0;

}
//定义归并函数
void guibing(int *_array,int p,int q,int r)//p表示左数组第一个元素下标,q表示左数组最后一个元素下标,r表示右数组最后一个元素下标
{
	int n1,n2;
	n1=q-p+1;//左数组的长度
	n2=r-q;//右数组的长度
	int *left=NULL,*right=NULL;
	left=(int *)malloc(sizeof(int)*n1);
	right=(int *)malloc(sizeof(int)*n2);
	int i=0,j=0;
	//下面将左数组的值赋给LEFT,将有数组的值赋给RIGHT
	for(i;i<n1;i++)
		left[i]=_array[p+i];
	for(j;j<n2;j++)
		right[j]=_array[q+1+j];
	//下面将左右值进行合并
	int i1=0,i2=0,k=p;
	while(i1<n1&&i2<n2)
	{
		if(left[i1]<=right[i2])
		{_array[k]=left[i1];
		i1++;
		k++;
		}
		else
		{_array[k]=right[i2];
		 i2++;
		 k++;
		}

	}
	for(;i1<n1;i1++)
	{
	   _array[k]=left[i1];
	   k++;

	}
	for(;i2<n2;i2++)
	{
	   _array[k]=right[i2];
	   k++;
	}

}
//下面定义分治算法
void merge_sort(int *_array,int p,int r)
{
   int q;
   if(p<r)
   {
    q=(int)((p+r)/2);
	merge_sort( _array,p,q);
	merge_sort( _array,q+1,r);
	guibing(_array,p,q,r);

   }

}
时间: 2024-12-18 20:38:46

算法导论第二章C++实现归并算法排序的相关文章

算法导论 第二章

2014-12-02 20:21:40 http://www.cnblogs.com/sungoshawk/p/3617652.html 上面链接指向算法导论第二章的预习博客,很值得一看,很详细. 插入算法: 1 #include <iostream> 2 3 using namespace std; 4 void insert_sort(int *datas, int length); 5 int main() 6 { 7 int a[10]={1,2,4,35,6,1,4,7,9,7};

算法导论 第二章作业

//作业2. 1-2 template<class T> void insert(T* A, int  n) { for (int j = 1; j < n; ++j) { T key = A[j]; int i = j - 1; while (i >= 0 && key > A[i]) { A[i + 1] = A[i]; --i; } A[i + 1] = key; } } //2. 1-3 template<class T> void fin

【算法导论第二章】算法基础

2.1插入排序 扑克牌这个栗子不错.以后得多用扑克牌来形象化思考排序问题. 根据伪代码用java实现插入排序 package com.panjn.java; /** * Created by panjianning on 2016/7/10. */ public class InsertionSort { public static void main(String[] args) { int[] array = new int[]{1, 3, 5, 7, 9, 2, 4, 6, 8, 10};

算法导论第二章

插入排序源码: 1 #include <iostream> 2 #include <cstdio> 3 4 using namespace std; 5 6 void insert_sort(int a[]) 7 { 8 for(int j=1;j<10;j++) 9 { 10 int key=a[j]; 11 int i=j-1; 12 while(i>=0 && a[i]>key) 13 { 14 a[i+1]=a[i]; 15 i--; 16

算法导论--第二章、插入排序

1. 插入排序类似于整理扑克牌(排列好顺序的扑克和待排序的扑克): 2. 插入排序(INSERTION-SORT)参数是一个数组A[1..n]共n个数,输入的各个数字原地排序(sorted in place),分为排好序的和待排序的,每次取一个待排序元素,找到插入的位置,插入已排好序的部分中.元素取完程序结束,复杂度为O(n^2): 3. 伪代码如下: INSERTION-SORT(A) for j <- 2 to length(A) do key <- A[j] //Insert A[j]

算法导论 第一章

算法导论 第一章,为了让自己基本功更加的扎实,从今天起开始学习算法导论. 我以一位学长的博客为学习的参考资料,开始我的学习吧! 附上一句话: Having a solid base of algorithm knowledge and technique is one characteristic that separates the truly skilled programmers from the novices. 是否具有扎实的算法知识和技术基础,是区分真正熟练的程序员与新手的一项重要特

补基础:自学:计算机科学导论 第二章 数字系统

2.2 位置化数字系统 在数字中符号所占据的位置决定了其表示的值.在该系统中,数字这样表示: +-(Sk-1  --S2S1S0 --S-l)b 它的值是: n = +-(Sk-1 * bk-1 + -- + S1 * b 1 + S0 * b0 + S-1 * b-1 + -- + S-l * b-l) S是一套符号集,:b是底(或基数),它等于S符号集中的符号总数. 2.2.1 十进制系统(以10为底) 十进制(decimal)来源于拉丁词根decem. 在该系统中,底b = 10, 并且用

算法导论第九章中位数和顺序统计量(选择问题)

本章如果要归结成一个问题的话,可以归结为选择问题,比如要从一堆数中选择最大的数,或最小的数,或第几小/大的数等, 这样的问题看似很简单,似乎没有什么可研究的必要,因为我们已经知道了排序算法,运用排序+索引的方式不就轻松搞定了?但细想,排序所带来的时间复杂度是不是让这个问题无形之中变得糟糕.那算法研究不就是要尽可能避免一个问题高复杂度地解决,让那些不敢肯定有无最优解的问题变得不再怀疑,这也是算法研究者所追求的一种极致哲学.既然排序让这个问题解决的性能无法确定,那我们就抛开排序,独立研究问题本身,看

Machine Learning In Action 第二章学习笔记: kNN算法

本文主要记录<Machine Learning In Action>中第二章的内容.书中以两个具体实例来介绍kNN(k nearest neighbors),分别是: 约会对象预测 手写数字识别 通过“约会对象”功能,基本能够了解到kNN算法的工作原理.“手写数字识别”与“约会对象预测”使用完全一样的算法代码,仅仅是数据集有变化. 约会对象预测 1 约会对象预测功能需求 主人公“张三”喜欢结交新朋友.“系统A”上面注册了很多类似于“张三”的用户,大家都想结交心朋友.“张三”最开始通过自己筛选的