实验一
实验名称:利用分治法实现快速排序
实验时
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(i nt a[],i nt p,i nt r) if(p<r)
{
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]<x&&i<r);
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二叶1。
在while 循环体中,下标j 逐渐减小,i 逐渐增大,,直到a[i]>=x>=a[j] 。
此时若i<j ,就应该交换a[i] 与a[j] 的位置,扩展左右两个区域。
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<iostream> 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的元素交换到左边区域
//将>x得元素交换到右边区域
while(true)
{ while(a[++i]<x&&i<r);
while(a[--j]>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<r)
{
int q=Partition(a,p,r);
//Partition 返回划分点j ,此处使q=j
QuickSort(a,p,q-1); QuickSort(a,q+1,r);
}
}
int main()
{
int len;
cout<<" 请输入数组长度: "; cin>>len;
int *a=new int[len];
// 动态生成一个长度为len 的数组
cout<<" 请输入一个数组: "
for(int i=0;i<len;i++) // 输入数组cin>>a[i];
QuickSort(a,0,len-1); // 对数组进行快排
cout<<" 排序后的数组是:";
for(int j=0;j<len;j++)
cout<<a[j]<<" "; // 输出数组cout<<endl;
delete[] a;
return 0;
}
四、实验结果(总结/ 方案) 运行程序,任意输入一个乱序数组,例如:
5 4 18 9 5
6 11 23
7 46 14 运行得到排序后的结果如下图:
欢迎您的下载,
资料仅供参考!
致力为企业和个人提供合同协议,策划案计划书,学习资料等等
打造全网一站式需求。