计算机算法设计与分析——合并排序和快速排序

合并排序

一、实验目的与要求

1、熟悉合并排序算法;

2、初步掌握分治算法;

二、实验题目

采用递归与非递归两种方式实现合并排序算法

参考输入、输出:

输入:输入第一行包括一个整数n,第二行包含n个整数,以空格间隔。

输出:输出一行n个整数,代表排序结果。

Simple input

4

1 5 4 12

Simple output

1 4 5 12

三、实现思想

将未排序序列先不断对半分割,直至每块数量为1个,再将每块两两组合排序,新形成的序列均为有序序列。

四、实现代码

#include<iostream>

#include<cstdlib>

using namespace std;

void merge(int A[],int p,int q,int r)

{

    int i=p;

    int j=q+1;

    int k=0;

    //int *temp = (int *)malloc((r-p+1)*sizeof(int));

    int *temp=new int[r-p+1];

    while(i<=q&&j<=r)

    {

        if(A[i]<=A[j])

            temp[k++]=A[i++];

        else

            temp[k++]=A[j++];

    }

    int star=i,end=q;

    if(j<=r)

        {

            star=j;

            end=r;

        }

        while(star<=end)

        {

            temp[k++]=A[star++];

        }

        for(int i=0;i<=r-p;i++)

            {

                A[p+i]=temp[i];  //这里犯过错误,注意A[p+i]这里,我们排序是根据传入的数组范围

            }

    //free(temp);

    delete []temp;

}

void merge_sort_c(int A[],int p,int r)

{

    if(p>=r)

        return;

    int q=(p+r)/2;

    merge_sort_c(A,p,q);

    merge_sort_c(A,q+1,r);

    merge(A,p,q,r);

}

void merge_sort(int A[],int n)

{

    merge_sort_c(A,0,n-1);

}

int main()

{

    int A[6]={3,2,7,4,5,1};

    merge_sort(A,6);

    for(int i=0;i<6;i++)

        cout<<A[i]<<" ";

    return 0;

}

五、实验结果

快速排序

一、实验目的与要求

1、熟悉快速排序算法;

2、初步掌握分治算法;

二、实验题目

实现快速排序算法

参考输入、输出:

输入:输入第一行包括一个整数n,第二行包含n个整数,以空格间隔。

输出:输出一行n个整数,代表排序结果。

Simple input

4

1 5 4 12

Simple output

1 4 5 12

三、实现思想

选取一个基准点,将序列排序,使基准点的左侧元素小于基准点,右侧的元素大于基准点;剩下的两个部分重复上述操作,选基准点分割。

 

四、实现代码

#include<iostream>

using namespace std;

//从一端扫描

/*int partition(int A[],int p,int r)

{

    int  pivot=A[r];

    int i=p;

    for(int j=p;j<=r-1;j++)

    {

        if(A[j]<pivot)

        {

            swap(A[i],A[j]);

            i++;

        }

    }

    swap(A[i],A[r]);

    return i;

}

//两个指针从两端扫描

int partition(int A[],int p,int r)

{

    int pivot=A[p];

    int left=p+1;

    int right=r;

    while(left<=right){

    while(left<=right&&A[left]<=pivot)

        left++;

    while(left<=right&&A[right]>pivot)

        right--;

    if(left<right)

    swap(A[left],A[right]);

    }

    swap(A[p],A[right]);

    return right;

}*/

void quick_sort_c(int A[],int p,int r)

{

    if(p>=r)

        return;

    int q=partition(A,p,r);

    quick_sort_c(A,p,q-1);

    quick_sort_c(A,q+1,r);

}

void quick_sort(int A[],int n)

{

    quick_sort_c(A,0,n-1);

}

int main()

{

    int A[10]={9,5,8,6,3,4,7,2,1,0};

    quick_sort(A,10);

    for(int i=0;i<10;i++)

        cout<<A[i]<<" ";

    return 0;

}

五、实验结果

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值