1快速排序及归并排序(分治策略)
- 格式:doc
- 大小:58.50 KB
- 文档页数:4
共 4 页 第 1 页 制表单位:设备处
天津商业大学学生实验报告
开课实验室: 403 机房 开课时间 2015年 3 月 1日 实验报告 2015年 6月 1 日
学院名称 信息工程学院 年级、专业、班 计科1303班 学
号
20134390 姓名 吴雪婷 同组姓名 无
课程名称 算法分析与设计 实验项
目名称
快速排序及归并排序(分治策略)
指导教师
杨亮
实验类型 验证 □√ 综合 □ 设计□ 创新□ 成绩
实验报告内容一般包括以下几个内容:1、目的要求 2、仪器用具及材料(仪器名称及主要规格、用具名称) 3、实验内容及原
理(简单但要抓住要点,写出依据原理) 4、操作方法与实验步骤 5、数据图表格(照片) 6、实验过程原始记录 7数据处理
及结果(按实验要求处理数据、结论) 8、讨论(对实验中存在的问题、进一步的想法等进行讨论)
一、实验目的
通过快速排序和归并排序的算法实现来加深对分治策略的了解。
二、实验内容
编程完成随机生成10,000个数,用快速排序和归并排序进行排序,并完成实验报告(要求粘贴
代码和实验结果截图)。
三、实验步骤和过程
快速排序和归并排序都是使用分治策略的算法,他们讲原有冒泡排序和插入排序的时间复杂度
从O(n2)降低到O(nlgn)。是当下最为流行的排序算法。
实验代码1:
#include
void quicksort(int array[],int left, int right);
void array_output(int array[],int slze);
int main(int argc, char* argv[])
{
int a[10]={4,2,1,3,6,8,6,2,10,8};
quicksort(a,0,9);
array_output(a,10);
return 0;
}
int partition(int array[], int left,int right){
int valou = array[right];
int p1 = left-1;
int p2 = right;
int tmp;
int index;
while(1) {
while (p1 < p2 && array[++p1] < valou);
while(p1 < p2 && array [--p2] > valou);
if (p1!=p2){
共 4 页 第 2 页 制表单位:设备处
tmp = array[p1];
array [p1] = array[p2];
array [p2] = tmp;
}
else{
index = p1;
break;
}
}
array[right] = array[p1];
array[p1] = valou;
return index;
}
void quicksort(int array[], int left, int right){
int index;
if (left < right){
index = partition(array,left,right);
quicksort(array,left,index-1);
quicksort(array,index+1,right);
}
else{
return;
}
}
void array_output(int array[], int slze){
int i;
for(i=0;i
}
printf("\n");
}
程序截图1:
程序代码2:
// reverse.cpp : Defines the entry point for the console application.
//
#include
#include
#define MAX 6
共 4 页 第 3 页 制表单位:设备处
int compute_reverse_number(int*,int, int);
int compute_cross_number(int*,int,int,int);
int main(int argc, char* argv[])
{
int x[MAX] = {5,4,1,6,8,9},reverse_num;
reverse_num = compute_reverse_number(x,0,MAX-1);
printf("The reverse number is %d \n",reverse_num);
return 0;
}
int compute_reverse_number(int array[],int left, int right){
int mid,left_num,right_num,cross_num;
if(right > left){
mid = (right + left)/2;
left_num = compute_reverse_number(array,left,mid);
right_num = compute_reverse_number(array,mid+1,right);
cross_num = compute_cross_number(array,left,mid,right);
return left_num + right_num + cross_num;
}else{
return 0;
}
}
int compute_cross_number(int array[],int left,int mid, int right){
int i=left,j=mid+1,temp[MAX],k=0;
int cross_number=0;
while(i<=mid && j<=right){
if(array[i] <= array[j]){
temp[k++] = array[i++];
}else{
cross_number += (mid - i+1);
for(int t=i;t<=mid;t++){
printf("There is a reverse pair between %d and %d \n",array[t],array[j]);
}
temp[k++] = array[j++];
}
}
if (i>mid){
while(j<=right){
temp[k++] = array[j++];
}
}
共 4 页 第 4 页 制表单位:设备处
else if(j>right){
while(i<=mid){
temp[k++] = array[i++];
}
}
for (i = left;i <= right;i++){
array[i] = temp[i-left];
}
return cross_number;
}
实验截图2:
注
1.每个实验项目一份实验报告。2.实验报告第一页学生必须使用规定的实验报告纸书写,附页用实验报告附页纸或A4纸书写。
3.实验教师必须对每份实验报告进行批改,用红笔指出实验报告中的错、漏之处,并给出成绩,签全名、注明日期。