100个随机数排序

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

#define Maxsize 100

typedef struct
{
    int R[Maxsize + 1];
    int length;
} SqList;

void InsertSort(SqList &L)
{
    int i, j;
    int count = 0;
    for (i = 2; i <= L.length; i++)
        if (L.R[i] < L.R[i - 1])
        {
            count++;
            L.R[0] = L.R[i];
            L.R[i] = L.R[i - 1];
            for (j = i - 2; L.R[0] < L.R[j]; j--, count++)
                L.R[j + 1] = L.R[j];
            L.R[j + 1] = L.R[0];
        }
    printf("\n直插法比较次数是:%d", count);
}

int ShellInsert(SqList &L, int dk)
{
    int i, j;
    int count = 0;
    for (i = dk + 1; i <= L.length; i++)
        if (L.R[i] < L.R[i - dk])
        {
            count++;
            L.R[0] = L.R[i];
            for (j = i - dk; j > 0 && L.R[0] < L.R[j]; j -= dk, count++)
                L.R[j + dk] = L.R[j];
            L.R[j + dk] = L.R[0];
        }
    return count;
}

void ShellSort(SqList &L, int dita[], int t)
{
    int k, count = 0, sum = 0;
    for (k = 0; k < t; k++)
    {
        count = ShellInsert(L, dita[k]);
        sum += count;
    }
    printf("\n希尔排序比较次数是:%d", sum);
}

int Partition(SqList &L, int low, int high, int &count)
{
    count = 0;
    int pivotkey;
    L.R[0] = L.R[low];
    pivotkey = L.R[low];
    while (low < high)
    {
        count++;
        while (low < high && L.R[high] >= pivotkey)
        {
            high--;
            count++;
        }
        if (low < high)
        {
            L.R[low++] = L.R[high];
            count++;
        }
        while (low < high && L.R[low] <= pivotkey)
        {
            low++;
            count += 2;
        }
        if (low < high)
        {
            L.R[high--] = L.R[low];
            count++;
        }
    }
    L.R[low] = L.R[0];
    return low;
}

void QSort(SqList &L, int low, int high, int &count)
{
    int pivotloc, sum;
    if (low < high)
    {
        count++;
        pivotloc = Partition(L, low, high, sum);
        count += sum;
        QSort(L, low, pivotloc - 1, count);
        QSort(L, pivotloc + 1, high, count);
    }
}

void Merge(int *R, int low, int m, int high, int &count)
{
    int i = low, j = m + 1, p = 0;
    int *R1;
    R1 = (int *)malloc((high - low + 1) * sizeof(int));
    if (!R1)
        return;
    while (i <= m && j <= high)
    {
        R1[p++] = (R[i] <= R[j]) ? R[i++] : R[j++];
        count += 2;
    }
    while (i <= m)
    {
        R1[p++] = R[i++];
        count++;
    }
    while (j <= high)
    {
        R1[p++] = R[j++], count++;
    }
    for (p = 0, i = low; i <= high; p++, i++)
        R[i] = R1[p];
}

void MergeSort(SqList &L, int low, int high, int &count)
{
    int mid;
    int sum = 0;
    if (low < high)
    {
        mid = (low + high) / 2;
        MergeSort(L, low, mid, count);
        MergeSort(L, mid + 1, high, count);
        Merge(L.R, low, mid, high, sum);
        count += sum;
    }
}

int main()
{
    int i;
    SqList L, L0;
    int dita[3];
    int count = 0, count1 = 0;
    srand((unsigned)time(NULL) + (unsigned)rand());
    for (i = 1; i <= 100; i++)
    {
        L.R[i] = rand() % 100;
        L0.R[i] = L.R[i];
    }
    printf("100个随机数是:\n");
    for (i = 1; i <= 100; i++)
    {
        if (i % 10)
            printf("%5d", L0.R[i]);
        else
        {
            printf("%5d", L0.R[i]);
            printf("\n");
        }
    }
    L.length = L0.length = 100;
    /*直插排序*/
    InsertSort(L);
    printf("\n直插排序结果:\n");
    for (i = 1; i <= 100; i++)
    {
        if (i % 10)
            printf("%5d", L.R[i]);
        else
        {
            printf("%5d", L.R[i]);
            printf("\n");
        }
    }
    for (i = 1; i <= 100; i++)
    {
        L.R[i] = L0.R[i];
    } /*更新L*/
    /*希尔排序*/
    dita[0] = 5;
    dita[1] = 3;
    dita[2] = 1;
    ShellSort(L, dita, 3);
    printf("\n希尔排序结果:\n");
    for (i = 1; i <= 100; i++)
    {
        if (i % 10)
            printf("%5d", L.R[i]);
        else
        {
            printf("%5d", L.R[i]);
            printf("\n");
        }
    }
    for (i = 1; i <= 100; i++)
    {
        L.R[i] = L0.R[i];
    } /*更新L*/
    /*快速排序*/
    QSort(L, 1, L.length, count);
    printf("\n快速排序比较次数是:%d\n", count);
    printf("快速排序结果:\n");
    for (i = 1; i <= 100; i++)
    {
        if (i % 10)
            printf("%5d", L.R[i]);
        else
        {
            printf("%5d", L.R[i]);
            printf("\n");
        }
    }
    /*归并排序*/
    for (i = 1; i <= 100; i++)
    {
        L.R[i] = L0.R[i];
    } /*更新L*/
    MergeSort(L, 1, 100, count1);
    printf("\n归并排序比较次数是:%d\n", count1);
    printf("归并排序结果:\n");
    for (i = 1; i <= 100; i++)
    {
        if (i % 10)
            printf("%5d", L.R[i]);
        else
        {
            printf("%5d", L.R[i]);
            printf("\n");
        }
    }
    system("pause");
}
  • 24
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Akihiris

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值