【算法设计与分析】4、合并排序

/**
* 书本:《算法分析与设计》
* 功能:给定线性序列集合中n个元素和一个整数k,1<=k<=n,输出者n个元素中第“k小”元素的值和位置
* 文件:lesson4.cpp
* 时间:2014年11月16日13:41:04
* 作者:cutter_point
*/
#include <iostream>

using namespace std;

/*
*1、实现这个算法首先肯定是要排序
*2、排好序之后第k个就是第k小的了
*3、再根据找出来的数据,回到原来的数组中找到原来的位置
*/
void paiXu(int *a, int *b, int left, int right, int mid);	//前向声明

//由于是吧b先排序排好,然后放回到a中,吧原来的数据覆盖所以得有一个吧b拷贝到a的过程
void copy(int *a, int *b, int left, int right)
{
	for (int i = left; i <= right; ++i)
	{
		a[i] = b[i];
	}
}

//使用合并排序对数组进行排序
void heBin(int *a, int left, int right)
{
	int *b = new int[sizeof(a) / sizeof(*a)];
	//首先这个算法至少得有两个元素吧
	if (left < right)
	{
		*b = { 0 };
		//去中点,一直取中点,直到剩下2个元素合并排序
		int mid = (left + right) / 2;
		//对这两边进行排序合并
		heBin(a, left, mid);
		heBin(a, mid + 1, right);

		/*
		cout<<endl;
		cout<<mid<<"--------------"<<endl;
		*/
		paiXu(a, b, left, right, mid);	//最后一道paiXu出问题了!!解决:由于是吧b先排序排好,然后放回到a中,吧原来的数据覆盖所以得有一个吧b拷贝到a的过程
		/*
		cout<<endl;
		for(int i = 0; i < 10 ; ++i)
		{
		cout<<b[i]<<' ';
		}
		*/
		copy(a, b, left, right);
	}
}

//这里有一个合并排序的核心算法
void paiXu(int a[], int *b, int left, int right, int mid)
{
	int rb = mid + 1;	//右边集合的开始
	int i = left, j = left;	//这个i和j一个是左边集合的起始,一个是b数组的计数器
	while (i <= mid && rb <= right)	//两边一起开始比较,合并排序,如果有一边满了,其余的直接按顺序拍下去就可以了
	{
		if (a[i] <= a[rb])	//左边集合的数据依次和右边的数据比较
			b[j++] = a[i++];	//把左边对应的数据先放到b中,然后向后推移一位
		else
			b[j++] = a[rb++];	//把左边对应的数据先放到b中,然后向后推移一位
	}

	//排序完成后剩下的继续
	//如果是左边的排完了,把右边剩下的排完
	if (i > mid)
	{
		for (int q = rb; q <= right; ++q)	//把右边剩下的全部拍到后面去
			b[j++] = a[q];
	}
	else
	{
		//右边的排完了,把左边的剩下的排完
		for (int q = i; q <= mid; ++q)
			b[j++] = a[q];

	}
}

//排序完成后输出要输出的数据
//1、原来的数组
//2、排好序的数组
//3、输出相应的数值和位置
void show(int *a, int *b, int k, int n)
{
	//a是原始数组,b是排好序的数组,k是要找的第k小的数,一共n个数
	/*
	int xunZhao = 0;
	cout << "原来的数组是:" << endl;
	for (int a1 = 0; a1 < n; ++a1)
	{
	cout << a[a1] << ' ';
	}
	*/
	//输出新的数组
	cout << endl << "排好序的数组是:" << endl;
	for (int a2 = 0; a2 < n; ++a2)
	{
		cout << a[a2] << ' ';
	}
	int xunZhao = 0;

	while (a[k - 1] != b[xunZhao])
	{
		++xunZhao;
	}

	cout << endl << "第 " << k << " 小的数是:" << a[k - 1] << " 原位置是:" << xunZhao + 1 << endl;

}

int main()
{
	char c;
	int k, n;

	int a[] = { 1, 2, 4, 3, 7, 5, 6, 8, 9, 10 };
	int b[] = { 1, 2, 4, 3, 7, 5, 6, 8, 9, 10 };
	n = 10;

	cout << "原来的数组是:" << endl;
	for (int a1 = 0; a1 < n; ++a1)
	{
		cout << b[a1] << ' ';
	}

	while (true)
	{
		heBin(a, 0, 9);

		cout << endl << "你想知道第几小的数?" << endl;
		cin >> k;
		show(a, b, k, n);
	}

	return 0;
}

时间: 2024-08-08 03:52:20

【算法设计与分析】4、合并排序的相关文章

(转)常用的算法设计与分析-一夜星辰的博客

算法设计与分析 分治法 思想 1. 将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同.递归地解这些子问题,然后将各子问题的解合并得到原问题的解. 2. divide-and-conquer(P) { if(|P| <= n0)adhoc(P); divide P into samller subinstances P1,P2...,Pk; for(int i = 1;i < k;i++) { yi = divide-and-conquer(Pi); } retu

算法设计与分析 ------最近对问题与8枚硬币问题

利用减治法实现8枚硬币问题: 参考资料:http://blog.csdn.net/wwj_748/article/details/8863503    算法设计--八枚硬币问题 1 #include "stdafx.h" 2 #include <iostream> 3 #include <stdio.h> 4 using namespace std; 5 6 7 void eightcoin(int arr[]); 8 void compare(int a,in

《计算机算法设计与分析》v4 第1章 算法概述 算法实现题答案

博主今年刚上大三,正好开算法这门课.由于博主本人比较喜欢算法但又比较懒,啃不动算法导论,所以决定拿这本书下手. 这本书是王晓东的第四版<计算机算法设计与分析>.初步打算将每章后面的算法题都用代码实现. 有些题跟某个ACM题目很像,我会把该ACM题的链接贴上.有的题没OJ交所以可能是错的.如有发现,还望指出. 1-1 统计数字问题 http://poj.org/problem?id=2282 这个题要按位分解,一位一位的来处理. #include<iostream> #include

【通知】《算法设计与分析》实验课、理论课补课、考试时间、加分等安排 及 个人目标设定

Logistic回归为概率型非线性回归模型,是研究二分类观察结果与一些影响因素之间关系的一种多 变量分析方法.通常的问题是,研究某些因素条件下某个结果是否发生,比如医学中根据病人的一些症状来判断它是 否患有某种病. 在讲解Logistic回归理论之前,我们先从LR分类器说起.LR分类器,即Logistic Regression Classifier. 在分类情形下,经过学习后的LR分类器是一组权值,当测试样本的数据输入时,这组权值与测试数据按 照线性加和得到 这里是每个样本的个特征. 之后按照s

算法设计与分析基础(第3版)读书笔记(及几处翻译上的错误~~)

算法设计与分析基础(第3版) p16 in-place翻译为'在位'?'就地'更合适点 p38 amortized应翻译为'均摊','摊销'这个词简直莫名其妙(可能因为翻译是做算法交易导致的?) p64 迭代优于递归(迭代始终是增量式的,而递归就没办法增量了,除非能够dump整个运行时栈) p73 通过算法可视化得到一个更好的非递归算法(人的图像认知直觉思维?) p79 验证一个拓扑是环.星.还是团?(这个地方有点意思,因为我想到了动态的Verify) p87 凸包问题:从数据结构上讲,Set<

算法设计与分析(屈婉玲)pdf

下载地址:网盘下载 算法设计与分析本教材为计算机科学技术专业核心课程"算法设计与分析"教材.<算法设计与分析>以算法设计技术和分析方法为主线来组织各知识单元,主要内容包括基础知识.分治策略.动态规划.贪心法.回溯与分支限界.算法分析与问题的计算复杂度.NP完全性.近似算法.随机算法.处理难解问题的策略等.书中突出对问题本身的分析和求解方法的阐述,从问题建模.算法设计与分析.改进措施等方面给出适当的建议,同时也简要介绍了计算复杂性理论的核心内容和处理难解问题的一些新技术. &

算法设计与分析——回溯法算法模板

以深度优先方式系统搜索问题解的算法称为回溯法.在回溯法中,解空间树主要分为了四种子集树.排列树.n叉树和不确定树. 在<算法设计与分析课本>中介绍了11个回溯法的问题样例,这里根据解空间树的类型做一个分类. 子集树 装载问题 符号三角形问题 0-1背包问题 最大团问题 算法模板: void backtrack(int t) { if(搜索到叶子结点) { return; } for(i=0; i<=1; i++) //01二叉树 { if(满足约束函数和限界函数)//剪枝 { backt

算法设计与分析-Week12

题目描述 You are given coins of different denominations and a total amount of money amount. Write a function to compute the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the c

算法实验:分治法合并排序(C++)

这篇文章分两部分来写,第一部分写代码的实现过程,第二部分把实验报告从头到尾呈现出来. 我习惯调试使用的编译器是DEV C++,不是vs系列的,可能头文件上有点区别.但是下面的报告是我放到vs里面测试过的,可以直接用,不影响. 第一部分:(解析) 题目:随机产生一个整型数组,然后用合并排序将该数组做升序排列,要求输出排序前和排序后的数组. 题目分析: 需要随机产生一个整数数组: 采用的算法是合并排序,也就是用归并排序: 输出排序后的数组. 随机产生一个整数数组:这个问题首先想到的是用rand()函