分治法实现快速排序

实验一

实验名称: 利用分治法实现快速排序 实验时间: 2012年12月 成绩:

一、实验目的

分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解这些子问题,然后将各个子问题的解合并得到原问题的解。

本实验的目的是利用分治策略实现快速排序算法。

二、实验内容

快速排序算法是基于分治策略的排序算法。其基本思想是,对于输入的子数组a[p:r],按以下三个步骤进行排序。

(1)分解:以a[p]为基准元素将a[p:r]划分成3段a[p:q-1],a[q]和a[q+1:r],使a[p:q-1]中任何一个元素小于等于a[q],而a[q+1:r]中任何一个元素大于等于a[q]。下标q在划分过程中确定。

(2)递归求解:通过递归调用快速排序算法分别对a[p:q-1]和a[q+1:r]进行排序。

(3)合并:由于对a[p:q-1]和a[q+1:r]的排序是就地进行的,所以在a[p:q-1]和a[q+1:r]都已排好的序后,不需要执行任何计算,a[p:r]就已排好序。

基于这个思想,可实现的快速排序算法如下:

void QuickSort(int a[],int p,int r)

{

if(p

{

int q=Partition(a,p,r);

QuickSort(a,p,q-1);

QuickSort(a,q+1,r);

}

}

对含有n个元素的数组a[0;n-1]进行快速排序只要调用QuickSort(a,0,n-1)即可。

上述算法中的函数Partition,以确定的一个基准元素a[p]对子数组a[p:r]进行划分,它是快速排序算法的关键。

int Partition(int a[],int p,int r)

{

int i=p,j=r+1;

int x=a[p];

while(true)

{

while(a[++i]

while(a[--j]>x);

if(i>=j) break;

Swap(a[i],a[j]);

}

a[p]=a[j];

a[j]=x;

return j;

}

Partition对a[p:r]进行划分时,以元素x=a[p]作为划分的基准,分别从左、右两端开始,扩展两个区域a[p:i]和a[j:r],使a[p:i]中元素小于或等于x,而a[j:r]中元素大于或等于x。初始时,i=p,且j=r+1。

在while循环体中,下标j逐渐减小,i逐渐增大,,直到a[i]>=x>=a[j]。此时若i

while循环重复至i>=j时结束。这时a[p:r]已被划分成a[p:q-1],a[q]和a[q+1:r],且满足a[p:q-1]中元素不大于a[q+1:r]中元素。在Partition结束时返回划分点q=j。

三、实验过程

#include

using namespace std;

inline void Swap(int &x,int &y) //交换x,y

{

}

int temp=x; x=y; y=temp;

int Partition(int a[],int p,int r)

//Partition 以确定一个基准元素a[q]对子数组a[p:r]进行划分 {

int i=p,j=r+1; int x=a[p]; //将x得元素交换到右边区域 while(true) { while(a[++i]x); if(i>=j) break; Swap(a[i],a[j]); //交换a[i],a[j] }

a[p]=a[j];

a[j]=x;

return j; //返回划分点

}

void QuickSort(int a[],int p,int r)

//利用递归进行快速排序

if(p

}

int main()

{

int len; cout>len; int *a=new int[len];

//动态生成一个长度为len的数组

cout

for(int i=0;i

cin>>a[i]; QuickSort(a,0,len-1); //对数组进行快排 cout

实验一

实验名称: 利用分治法实现快速排序 实验时间: 2012年12月 成绩:

一、实验目的

分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解这些子问题,然后将各个子问题的解合并得到原问题的解。

本实验的目的是利用分治策略实现快速排序算法。

二、实验内容

快速排序算法是基于分治策略的排序算法。其基本思想是,对于输入的子数组a[p:r],按以下三个步骤进行排序。

(1)分解:以a[p]为基准元素将a[p:r]划分成3段a[p:q-1],a[q]和a[q+1:r],使a[p:q-1]中任何一个元素小于等于a[q],而a[q+1:r]中任何一个元素大于等于a[q]。下标q在划分过程中确定。

(2)递归求解:通过递归调用快速排序算法分别对a[p:q-1]和a[q+1:r]进行排序。

(3)合并:由于对a[p:q-1]和a[q+1:r]的排序是就地进行的,所以在a[p:q-1]和a[q+1:r]都已排好的序后,不需要执行任何计算,a[p:r]就已排好序。

基于这个思想,可实现的快速排序算法如下:

void QuickSort(int a[],int p,int r)

{

if(p

{

int q=Partition(a,p,r);

QuickSort(a,p,q-1);

QuickSort(a,q+1,r);

}

}

对含有n个元素的数组a[0;n-1]进行快速排序只要调用QuickSort(a,0,n-1)即可。

上述算法中的函数Partition,以确定的一个基准元素a[p]对子数组a[p:r]进行划分,它是快速排序算法的关键。

int Partition(int a[],int p,int r)

{

int i=p,j=r+1;

int x=a[p];

while(true)

{

while(a[++i]

while(a[--j]>x);

if(i>=j) break;

Swap(a[i],a[j]);

}

a[p]=a[j];

a[j]=x;

return j;

}

Partition对a[p:r]进行划分时,以元素x=a[p]作为划分的基准,分别从左、右两端开始,扩展两个区域a[p:i]和a[j:r],使a[p:i]中元素小于或等于x,而a[j:r]中元素大于或等于x。初始时,i=p,且j=r+1。

在while循环体中,下标j逐渐减小,i逐渐增大,,直到a[i]>=x>=a[j]。此时若i

while循环重复至i>=j时结束。这时a[p:r]已被划分成a[p:q-1],a[q]和a[q+1:r],且满足a[p:q-1]中元素不大于a[q+1:r]中元素。在Partition结束时返回划分点q=j。

三、实验过程

#include

using namespace std;

inline void Swap(int &x,int &y) //交换x,y

{

}

int temp=x; x=y; y=temp;

int Partition(int a[],int p,int r)

//Partition 以确定一个基准元素a[q]对子数组a[p:r]进行划分 {

int i=p,j=r+1; int x=a[p]; //将x得元素交换到右边区域 while(true) { while(a[++i]x); if(i>=j) break; Swap(a[i],a[j]); //交换a[i],a[j] }

a[p]=a[j];

a[j]=x;

return j; //返回划分点

}

void QuickSort(int a[],int p,int r)

//利用递归进行快速排序

if(p

}

int main()

{

int len; cout>len; int *a=new int[len];

//动态生成一个长度为len的数组

cout

for(int i=0;i

cin>>a[i]; QuickSort(a,0,len-1); //对数组进行快排 cout


相关文章

  • B5分治思想与递归算法的应用
  • 一.分治思想 例1.找伪币 [问题描述] 给你一个装有16个硬币的袋子,16个硬币中有一 个是伪造的,并且那个伪造的硬币比真的硬币要轻一 些. 你的任务是找出这个伪造的硬币. 为了帮助你完成这一任务,将提供一台可用来比 较两组硬币重量的仪器 ...查看


  • 西安邮电大学算法资料
  • 选择: 1.算法的性质包括输入.输出.( A ).有限性. A. 确定性 B. 随机性 C. 复杂性 D. 渐近复杂性 2.备忘录法是那种算法的变形( B ). A.分治算法 B.动态规划算法 C.贪心算法 D.回溯法 3.具有最优子结构的 ...查看


  • 2013计算机算法设计与分析期终考试复习题
  • 计算机算法设计与分析复习题 一.填空题 1.一个算法复杂性的高低体现在计算机运行该算法所需的时间和存储器资源上,因此算法的复杂性有 时间 复杂性和空间复杂性之分. 2.出自于"平衡子问题"的思想,通常分治法在分割原问题, ...查看


  • 算法设计与分析(第2版)-王红梅-胡明-习题答案
  • 算法设计与分析(第2版)-王红梅-胡明-习题 答案 习题1 1. 图论诞生于七桥问题.出生于瑞士的伟大数学家欧拉(Leonhard Euler,1707-1783) 提出并解决了该问题.七桥问题是这样描述的:一个人是否能在一次步行中穿越哥尼 ...查看


  • 算法分析--分治法
  • 分治算法 小组的汇报内容: 一.分治算法的基本概念„„„„„„„„„„„„„第2页 二.分治算法的基本思想及策略„„„„„„„„„„第2页 三.分治法适用的情况„„„„„„„„„„„„„„第3页 四.分治法的基本步骤„„„„„„„„„„„„ ...查看


  • 算法设计与分析复习题目及答案
  • 分治法 1.二分搜索算法是利用( 分治策略)实现的算法. 9. 实现循环赛日程表利用的算法是(分治策略 ) 27.Strassen矩阵乘法是利用(分治策略 )实现的算法. 34.实现合并排序利用的算法是(分治策略 ). 实现大整数的乘法是利 ...查看


  • 计算机算法分析与设计+++论文2
  • 河北科技师范学院 欧美学院 算法设计与分析个人总结 指导教师 院 系 班 级 学生姓名 学 号 引言:对于计算机科学来说,算法分析与设计是至关重要的.在一个大型软件系统的开发中,设计出有效的算法将起到决定性的作用.通俗的讲,算法是解决问题的 ...查看


  • 算法设计与分析基础习题参考答案
  • 习题 1.1 5..证明等式 gcd(m,n)=gcd(n,m mod n)对每一对正整数 m,n 都成立. Hint: 根据除法的定义不难证明: 如果 d 整除 u 和 v, 那么 d 一定能整除 u±v; 如果 d 整除 u,那么 d ...查看


  • 快速排序问题
  • 快速排序问题 张懿 1问题描述 对于有1,000,000个乱序数据的数据文件执行快速排序. 2 本实验在Windows8.1环境下实现.实验环境 3实验步骤 (1)首先产生包含1,000,000个随机数(数据类型可选整型或者浮点型)的数据文 ...查看


热门内容