09-排序1 排序

237 阅读2分钟

题目描述

给定N个(长整型范围内的)整数,要求输出从小到大排序后的结果。

本题旨在测试各种不同的排序算法在各种数据情况下的表现。各组测试数据特点如下:

  • 数据1:只有1个元素;
  • 数据2:11个不相同的整数,测试基本正确性;
  • 数据3:103个随机整数;
  • 数据4:104个随机整数;
  • 数据5:105个随机整数;
  • 数据6:105个顺序整数;
  • 数据7:105个逆序整数;
  • 数据8:105个基本有序的整数;
  • 数据9:105个随机正整数,每个数字不超过1000。

输入格式

输入第一行给出正整数N(≤105),随后一行给出N个(长整型范围内的)整数,其间以空格分隔。

输出格式

在一行中输出从小到大排序后的结果,数字间以1个空格分隔,行末不得有多余空格。

输入样例

11
4 981 10 -17 0 -20 29 50 8 43 -5

输出样例

-20 -17 -5 0 4 8 10 29 43 50 981

题解

冒泡排序

稳定

#include <stdio.h>

void BubbleSort(int A[], int N)
{
    int i, p, flag, tmp;
    for (p = N - 1; p > 0; p--) {
        flag = 0;
        for (i = 0; i < p; i++) {
            if (A[i] > A[i + 1]) {
                tmp = A[i];
                A[i] = A[i + 1];
                A[i + 1] = tmp;
                flag = 1;
            }
        }
        if (flag == 0) break;
    }
}

int main()
{
    int i, N, A[100000];
    scanf("%d", &N);
    for (i = 0; i < N; i++) scanf("%d", &A[i]);
    BubbleSort(A, N);
    for (i = 0; i < N; i++)
        if (i) printf(" %d", A[i]);
        else printf("%d", A[i]);
    return 0;
}

未通过样例:

  • 数据5:105个随机整数;
  • 数据9:105个随机正整数,每个数字不超过1000。

Pasted image 20220823103911.png

插入排序

稳定

#include <stdio.h>

void InsertionSort(int A[], int N)
{
    int i, p, flag, tmp;
    for (p = 1; p < N; p++) {
        tmp = A[p];
        for (i = p; i > 0 && A[i - 1] > tmp; i--) {
            A[i] = A[i - 1];
        }
        A[i] = tmp;
    }
}

int main()
{
    int i, N, A[100000];
    scanf("%d", &N);
    for (i = 0; i < N; i++) scanf("%d", &A[i]);
    InsertionSort(A, N);
    for (i = 0; i < N; i++)
        if (i) printf(" %d", A[i]);
        else printf("%d", A[i]);
    return 0;
}

所有样例均通过

Pasted image 20220823110646.png

希尔排序

使用 Sedgewick 增量序列

  • 先确定初始增量
  • 再根据增量间隔使用插入排序
#include <stdio.h>

void ShellSort(int A[], int N)
{
    int Si, D, i, p, flag, tmp;
    int Sedgewick[] = {929, 505, 209, 109, 41, 19, 5, 1, 0};
    for (Si = 0; Sedgewick[Si] >= N; Si++) ;
    for (D = Sedgewick[Si]; D > 0; D = Sedgewick[++Si])
         for (p = D; p < N; p++) {
             tmp = A[p];
             for (i = p; i >= D && A[i - D] > tmp; i -= D)
                 A[i] = A[i - D];
             A[i] = tmp;
         }
}

int main()
{
    int i, N, A[100000];
    scanf("%d", &N);
    for (i = 0; i < N; i++) scanf("%d", &A[i]);
    ShellSort(A, N);
    for (i = 0; i < N; i++)
        if (i) printf(" %d", A[i]);
        else printf("%d", A[i]);
    return 0;
}

所有样例均通过

Pasted image 20220823110646.png