合并排序的非递归实现

 

专业课程实验报告

 

课程名称:          算法设计与分析

 

开课学期:    2016  至   2017   学年第     1   学期

 

专业:计算机科学与技术 年级班级: 2014级2班 

 

学生姓名:     宋--     学号:222014321210----

 

实验教师:              曹严元

 

 

计算机与信息科学学院 软件学院


 

实验项目名称

合并排序的非递归实现

实验时间

2016年9月20日

实验类型

√验证性 □设计性 □综合性

 

一、实验目的

1.       了解并掌握递归的概念,递归算法的基本思想;

2.       掌握分治法的基本思想方法;

3.       了解适用于用分治法求解的问题类型,并能用递归或非递归的方式设计相应的分治法算法;

4.       掌握分治法复杂性分析方法,比较同一个问题的递归算法与循环迭代算法的效率。

二、实验要求

1.       预习实验指导书及教材的有关内容,掌握分治法的基本思想;

2.       严格按照实验内容进行实验,培养良好的算法设计和编程的习惯;

3.       认真听讲,服从安排,独立思考并完成实验。

三、实验内容与设计

1.       实现一个“由底向上”的归并分类算法,要求取消栈空间的需要。

(1)        选择合适的数据结构来表示问题;

(2)        根据分治法的基本原理,写出归并分类问题的伪码算法;

(3)        编制C++或JAVA等高级语言程序实现伪码算法;

(4)        上机运行程序,验证算法的正确性,并分析算法的时空复杂性。

四、实验结果分析及总结

实验结果:

 

实验内容:

package security;

 

import java.util.Arrays;

import java.util.Scanner;

//归并排序的非递归算法

public class MergeSort{

    public static void main(String args[]){

        MergeSort mer = new MergeSort();

        int[] array = mer.getArray();

        System.out.println("原始数组:" + Arrays.toString(array));

        mer.mergeSort(array);

        System.out.println("排序后数组:" + Arrays.toString(array));

    }

   

    public int[] getArray(){

        Scanner cinNum = new Scanner(System.in);

        System.out.println("请输入需要排序的个数:");

        int length = cinNum.nextInt();

       

       

        int[] array = new int[length];

        System.out.println("请输入数组内容:");

       

        Scanner cinContent = new Scanner(System.in);

        for (int i = 0; i < array.length; i++) {// 初始化数组

            array[i] = cinContent.nextInt();

        }

        cinNum.close();

        cinContent.close();

       // System.out.println(Arrays.toString(array));// 打印确认正确无误

  

        returnarray;

    }

   

    public void mergeSort(int[] a){

        int len = 1;

        while(len < a.length){

            for(int i = 0; i < a.length; i += 2*len){

                merge(a, i, len);

            }

            len *= 2;

        }

    }

 

    public void merge(int[] a, int i, int len){

        int start = i;

        int len_i = i + len;//归并的前半部分数组

        int j = i + len;

        int len_j = j +len;//归并的后半部分数组

        int[] temp = new int[2*len];

        int count = 0;

        while(i < len_i && j < len_j && j < a.length){

            if(a[i] <= a[j]){

                temp[count++] = a[i++];

            }

            else{

                temp[count++] = a[j++];

            }

        }

        while(i < len_i && i < a.length){

            temp[count++] = a[i++];

        }

        while(j < len_j && j < a.length){

            temp[count++] = a[j++];

        }

        count = 0;

        while(start < j && start < a.length){

            a[start++] = temp[count++];

        }

    }

}

五、实验总结

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归归并。

经过本次实验,能够掌握分治法的基本思想,了解适用于用分治法求解的问题类型,能够用非递归的方式设计相应的分治法算法。对于归并算法的非递归实现,可以沿着递归实现的逆向方向去思考,递归的思想是自顶向下,将待排序序列不断分解,然后再归并。而非递归的思想就是自底向上,先两两归并,然后再4个4个一起归并,再8个。在这个过程中一定要注意尾部数据的处理,因为序列的长度不一定就是归并长度的整数倍。

归并排序的时间复杂度为O(n*log2n),空间复杂度为O(n),因而归并排序是一种稳定的排序方法。

 

 

 

实验成绩(A-E):

反馈评语:

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值