HNU数据结构与算法分析-实验七---大数据排序

首先向大家介绍HNU数据结构与算法分析-实验体系

实验一共分为8个,

其中奇数个(1、3、5、7)为底层代码实现底层算法或数据结构,也称基础实验,

这一部分实验的代码需要同学们熟练掌握,甚至倒背如流,也会设置监考保证实验独立进行。

偶数个(2、4、6、8)为综合实验,是一些简单的应用类问题。

这八个实验合起来占HNUer的数据结构课程总成绩的20%。

最后,如果感觉有帮助的话还请点个赞,你的重要支持是我持续创作的动力。

那么让我们来看一下今天的题目吧

1.shell排序

【问题描述】

        输入若干整数,使用shell排序后输出。
【输入形式】

        输入的第一行一个整数 n  0 < ≤ 107),表示待排序的数的个数。

        接下来的一行,包含 n 个整数,表示待排序的数据。
【输出形式】

        输出为一行 n 个数,表示已排序后的数。

【样例输入】

5
5 4 3 2 1

【样例输出】

1 2 3 4 5

【样例说明】
【评分标准】

# include <iostream>
# include <algorithm>
using namespace std;

void inssort(int *A, int n, int incr)
{
    for(int i = incr; i < n; i += incr)
        for(int j = i; (j >= incr) && (A[j] < A[j - incr]); j -= incr)
            swap(A[j], A[j - incr]);
}

void shellsort(int *A, int n)
{
    for (int i=n/2; i>2; i/=2)
    {
    for (int j=0;j<i;j++)
    {inssort(A+j-1,n-j,i);}
    }
    inssort(A,n,1);
}


int main()
{
    int n;
    scanf("%d", &n);
    int *a;
    a = new int[n];
    for(int i = 0; i < n; i++)
        cin >> a[i];

    shellsort(a, n);

    for(int i = 0; i < n; i++)
        cout << a[i] << " ";
    cout << endl;
    return 0;
}

2.归并排序

【问题描述】

        输入若干整数,使用归并排序后输出。
【输入形式】

        输入的第一行一个整数 n  0 < ≤ 107),表示待排序的数的个数。

        接下来的一行,包含 n 个整数,表示待排序的数据。
【输出形式】

        输出为一行 n 个数,表示已排序后的数。

【样例输入】

5
5 4 3 2 1

【样例输出】

1 2 3 4 5

【样例说明】
【评分标准】

# include <iostream>
# include <algorithm>
using namespace std;


void mergesort(int *A, int *temp, int left, int right)
{
  
if (left==right) return;
int mid = (left+right)/2;
mergesort(A,temp,left,mid);
mergesort(A,temp,mid+1,right);
for (int i=left;i<=right;i++){temp[i]=A[i];}
int i1=left; int i2=mid+1;
for (int curr=left; curr<=right;curr++)
{
if (i1==mid+1) A[curr]=temp[i2++];
else if (i2>right) A[curr]=temp[i1++];
else if (temp[i1]<temp[i2]) A[curr]=temp[i1++];
else A[curr]=temp[i2++];
}



}

int main()
{
    int n;
    scanf("%d", &n);
    int *a, *temp;
    a = new int[n];
    temp = new int[n];
    for(int i = 0; i < n; i++)
        cin >> a[i];

    mergesort(a, temp, 0, n - 1);     

    for(int i = 0; i < n; i++)
        cout << a[i] << " ";
    cout << endl;
    return 0;
}

3.快速排序

【问题描述】

        输入若干整数,使用快速排序后输出。
【输入形式】

        输入的第一行一个整数 n  0 < ≤ 107),表示待排序的数的个数。

        接下来的一行,包含 n 个整数,表示待排序的数据。
【输出形式】

        输出为一行 n 个数,表示已排序后的数。
【样例输入】

5
5 4 3 2 1

【样例输出】

1 2 3 4 5

【样例说明】
【评分标准】

# include <iostream>
# include <algorithm>
using namespace std;

inline int findpivot(int *A, int i, int j)
{
    return (i + j) / 2;
}
inline int Partition(int *A, int left, int right, int& pivot)
{
    do
    {
        while(A[++left] < pivot);
        while((left < right) && (pivot < A[--right]));
        swap(A[left], A[right]);
    }
    while(left < right);
    return left;
}
void qsort(int *A, int left, int right)
{
    int i=left;
    int j=right;
    if (j<=i) return;
    int pivotindex=findpivot(A,i,j);
    int temp=A[pivotindex];
    A[pivotindex]=A[j];
    A[j]=temp;
    int k=Partition(A,i-1,j,A[j]);
    int temp2=A[k];
    A[k]=A[j];
    A[j]=temp2;
    qsort(A,i,k-1);
    qsort(A,k+1,j);
}
int main()
{
    int n;
    scanf("%d", &n);
    int *a;
    a = new int[n];

    for(int i = 0; i < n; i++)
        cin >> a[i];

    qsort(a, 0, n - 1);

    for(int i = 0; i < n; i++)
        cout << a[i] << " ";
    cout << endl;
    return 0;
}

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值