分治法实现快速排序 - 范文中心

分治法实现快速排序

02/25

实验一

实验名称: 利用分治法实现快速排序 实验时间: 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


相关内容

  • 排序比较次数的数据结构分析
    排序 排序问题的输入是一个线性表,该线性表的元素属于一个偏序集:要求对该线性表的元素做某种重排,使得线性表中除表尾外的每个元素都小于等于(或大于等于)它的后继. 设R 为非空集合A 上的二元关系,如果R 满足自反性(对于每一个x ∈A ,( ...
  • PHP冒泡排序和查找算法介绍
    最新PHP冒泡排序和查找算法介绍 以下是三零网为大家整理的最新PHP冒泡排序和查找算法介绍的文章,希望大家能够喜欢! 冒泡排序(bubble sort)的原理是什么? 冒泡排序的原理可以顾名思义:把每个数据看成一个气泡,按初始顺序自底向上依 ...
  • 简单快速的平面散乱点集凸包算法_金文华
    1999年2月 第25卷第1期北京航空航天大学学报 Journal of Beijing University of Aeronautics and Astronautics February 1999Vol . 25 No . 11) 简 ...
  • 数据结构导论试题1
    全国2004年10月高等教育自学考试 1.要将现实生活中的数据转化为计算机所能表示的形式,其转化过程依次为( ) A.逻辑结构.存储结构.机外表示 B.存储结构.逻辑结构.机外表示 C.机外表示.逻辑结构.存储结构 D.机外表示.存储结构. ...
  • 东南大学数据结构 93-20**年
    东南大学93考研题 注意事项 : (1) 答卷上需写清题号,不必抄题 (2) 描述可用你熟悉的一种类高级语言,如类Pascal ,所用主要数据结构及变量的意义须加以注释.必要时算法中应加注释 . 一.回答下列问题 : (共 35分) l 与 ...
  • 20世纪十大算法
    20世纪十大算法 本世纪初,美国物理学会(AmericanInstitute of Physics)和IEEE计算机社团(IEEE Computer Society)的一本联合刊物<科学与工程中的计算>发表了由田纳西大学的Jac ...
  • [数据结构]期末考试题及答案
    2011-2012学年第一学期期末考查 <数据结构>试卷 (答案一律写在答题纸上,在本试卷上做答无效) 一.选择(每题1分,共10分) 1. 长度为n 的线性表采用顺序存储结构,一个在其第i 个位置插入新元素的算法时间复杂度为( ...
  • 关于辛亥革命的论文
    回顾历史 展望未来 -追寻辛亥革命的精神 摘要:时至今年,辛亥革命已经过去100周年了,但是中国历史上这一次伟大的革命依然被广大的中国人民所牢记,依然激动人心,辛亥革命仁人志士的崇高精神依然值得我们学习和敬仰.在新时代,我们依然面临着各方面 ...
  • 治胃病的偏方
    治胃病的偏方 胃病的发生与人们的不良生活.饮食习惯密切相关,可以说,"吃"出来的胃病,还得靠"吃"来调养.一起来了解生活中最常用的胃病偏方,早日养出健康胃. 现代人,特别是年轻的一辈,都多多少少有些胃 ...
  • 阿里巴巴培训
    信息质量提升手册 前 言 该手册主要是从买家体验和阿里巴巴网站规范的角度出发,通过对许多真实案例的整理提炼编辑而成,用于指导卖家提升自身的信息质量,内容涵盖信息质量提升的指导,指导部分主要采用文字提要和实例相结合的形式,从产品名称,关键词, ...