栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

排序算法的实现(C语言)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

排序算法的实现(C语言)

#include 
#include 
#include 
#include 
#include 
#include 
// #include 
// #include 
// using namespace std;
const int MAX_SIZE = 1e7;

typedef struct seqlist
{
    int *data;
    int length;
    int size;
} seqlist;

void COLOR_PRINT(const int a, int color)
{
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | color);
    printf("%04d ", a);
    SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | 15);
}

void swap(int &a, int &b)
{
    int temp = a;
    a = b;
    b = temp;
}

bool ini(seqlist *L)
{
    L->data = (int *)malloc(MAX_SIZE * sizeof(int));
    if (L->data != NULL)
    {
        L->length = 0;
        L->size = MAX_SIZE;
        return 1;
    }
    else
    {
        printf("ERROR!n");
        return 0;
    }
}

int in(seqlist *L)
{
    int n;
    printf("请输入你想排列的关键字(整形)长度n");
    scanf("%d", &n);
    printf("请输入你想排列的关键字(整形)序列n");
    while (L->length < n)
    {
        int da;
        scanf("%d", &da);
        L->data[L->length++] = da;
    }

    return 0;
}

void insertsort(seqlist *L)
{
    clock_t starttime = clock();
    int i, k, j, temp;
    for (i = 1; i < L->length; i++)
    {
        temp = L->data[i];
        for (j = i - 1; j >= 0 && L->data[j] > temp; j--) //将有序序列中比待插入关键字小的关键字全部后移一位
        {
            L->data[j + 1] = L->data[j];
        }
        L->data[j + 1] = temp;          //待插入关键字插入
        for (k = 0; k < L->length; k++) //输出每趟结果
        {
            printf("%04d ", L->data[k]);
            if (k == i)
                printf("b|");
        }
        printf("n");
    }
    clock_t endtime = clock();
    printf("排序用时:%lfsn", (double)(endtime - starttime) / CLOCKS_PER_SEC);
}

void insertsort_of_BS(seqlist *L)
{
    clock_t starttime = clock();

    //此处二分查找使用循环实现,下方快排使用递归实现
    int i, k, j, temp, l, r, mid;
    for (i = 1; i < L->length; i++)
    {
        temp = L->data[i];

        //二分查找
        l = 0;
        r = i - 1;
        while (l <= r) //截止条件
        {
            mid = (l + r) >> 1; //正整数除以二的最快写法
            if (temp < L->data[mid])
                r = mid - 1;
            else
                l = mid + 1;
        }

        for (j = i - 1; j > r; j--) //将有序序列中比待插入关键字小的关键字全部后移一位
            L->data[j + 1] = L->data[j];
        L->data[r + 1] = temp; //待插入关键字插入

        for (k = 0; k < L->length; k++) //输出每趟结果
        {
            printf("%04d ", L->data[k]);
            if (k == i)
                printf("b|");
        }
        printf("n");
    }
    clock_t endtime = clock();
    printf("排序用时:%lfsn", (double)(endtime - starttime) / CLOCKS_PER_SEC);
}

void selectionsort(seqlist *L)
{

    clock_t starttime = clock();
    int mi, k, i, j;
    for (i = 0; i < L->length - 1; i++)
    {
        mi = i; //找i后面的关键字中最小的
        for (j = i + 1; j < L->length; j++)
        {
            if (L->data[j] < L->data[mi])
                mi = j;
        }
        swap(L->data[i], L->data[mi]);

        for (k = 0; k < L->length; k++) //输出每趟结果
        {
            printf("%04d ", L->data[k]);
            if (k == i)
                printf("b|");
        }
        printf("n");
    }
    clock_t endtime = clock();
    printf("排序用时:%lfsn", (double)(endtime - starttime) / CLOCKS_PER_SEC);
}

void bubblesort(seqlist *L)
{
    clock_t starttime = clock();
    int i, j, k, q, flag;
    for (i = 0; i < L->length - 1; i++)
    {
        flag = 0;
        for (j = 0; j < L->length - i - 1; j++)
        {
            if (L->data[j] > L->data[j + 1])
            {
                ++flag;
                swap(L->data[j], L->data[j + 1]);
            }
        }

        for (k = 0; k < L->length; k++) //输出每趟结果
        {
            printf("%04d ", L->data[k]);
            if (k == L->length - i - 2)
                printf("b|");
        }
        printf("n");

        if (flag <= 1) //这里零次交换或只有一次交换我就提前结束,比传统冒泡快n
            break;
    }
    clock_t endtime = clock();
    printf("排序用时:%lfsn", (double)(endtime - starttime) / CLOCKS_PER_SEC);
}

void shellsort(seqlist *L)
{
    clock_t starttime = clock();
    int i, j, k, temp, q, n = L->length;
    int gap = n / 2; //增量

    while (gap >= 1)
    {
        //插入排序
        for (i = 0; i < gap; i++)
        {
            for (j = i + gap; j < n; j += gap)
            {
                temp = L->data[j];
                for (q = j - gap; q >= 0 && L->data[q] > temp; q -= gap)
                    L->data[q + gap] = L->data[q];
                L->data[q + gap] = temp;
            }

            for (k = 0; k < L->length; k++) //输出每趟结果
            {
                printf("%04d ", L->data[k]);
                if ((k + 1) % gap == 0)
                    printf("b|");
            }
            printf("n");
        }
        gap /= 2;
    }
    clock_t endtime = clock();
    printf("排序用时:%lfsn", (double)(endtime - starttime) / CLOCKS_PER_SEC);
}

clock_t quicksort(seqlist *L, int left, int right)
{
    //此处递归实现
    int l, r, k, z, mark;
    if (left > right)
        return clock();

    l = left;
    r = right;
    int benchmark = L->data[left]; //以区间的最左为基准

    while (l < r)
    {                                            //取最左端元素为基准
        while (l < r && L->data[r] >= benchmark) //找到右边第一个比基准值小的元素
            r--;
        L->data[l] = L->data[r];                 //移动
        while (l < r && L->data[l] <= benchmark) //找到左边第一个比基准值大的元素
            l++;
        L->data[r] = L->data[l]; //移动
    }
    L->data[l] = benchmark;

    for (k = 0; k < L->length; k++) //输出当前结果
    {
        if (k == l)
            COLOR_PRINT(L->data[k], 12);
        else
            printf("%04d ", L->data[k]);
    }
    printf("n");

    quicksort(L, left, l - 1);
    quicksort(L, l + 1, right);
}

void out(seqlist L)
{
    for (int i = 0; i < L.length; i++)
    {
        printf("%04d", L.data[i]);
        if ((i + 1) % 10 == 0)
            printf("n");
        else
            printf(" ");
    }
    getchar();
    getchar();
}

void copy_to_anothor(seqlist *A, seqlist B)
{
    for (int i = 0; i < B.length; i++)
        A->data[i] = B.data[i];
}

void menu()
{
    printf("请选择功能:n");
    printf("0.生成随机数列并输入新创建的顺序表n");
    printf("1.创建新的顺序表n");
    printf("2.直接插入排序n");
    printf("3.二分优化的插入排序n");
    printf("4.选择排序n");
    printf("5.冒泡排序n");
    printf("6.希尔排序n");
    printf("7.快排n");
    printf("8.还原关键字顺序n");
    printf("9.显示当前关键字n");
    printf("10.退出n");
}

int main()
{
    seqlist list;
    seqlist copy;
    while (1)
    {
        system("cls");
        menu();
        int x;
        scanf("%d", &x);
        switch (x)
        {
        case 0: //生成随机数
            printf("输入数列长度n");
            int n;
            scanf("%d", &n);

            if (ini(&list) && ini(©))
                srand((int)time(NULL));

            for (int i = 0; i < n; i++)
            {
                list.data[list.length++] = rand() % 10000; //输入顺序表
                copy.data[copy.length++] = list.data[i];   //拷贝
                printf("%04d", list.data[i]);              //显示该随机数
                if ((i + 1) % 10 == 0)
                    printf("n");
                else
                    printf(" ");
            }
            getchar();
            getchar();
            break;
        case 1: //读入关键字
            if (ini(&list) && ini(©))
            {
                in(&list);
                copy_to_anothor(©, list);
            }
            getchar();
            break;
        case 2: //插入
            out(list);
            insertsort(&list);
            out(list);
            break;
        case 3: //二分优化的插入
            out(list);
            insertsort_of_BS(&list);
            out(list);
            break;
        case 4: //选择
            out(list);
            selectionsort(&list);
            out(list);
            break;
        case 5: //冒泡
            out(list);
            bubblesort(&list);
            out(list);
            break;
        case 6: //希尔
            shellsort(&list);
            out(list);
            break;
        case 7: //快排
        {
            out(list);
            clock_t starttime = clock();
            clock_t endtime = quicksort(&list, 0, list.length - 1);
            printf("排序用时:%lfsn", (double)(endtime - starttime) / CLOCKS_PER_SEC);
            out(list);
            break;
        }
        case 8:
            copy_to_anothor(&list, copy);
            break;
        case 9:
            out(list);
            break;
        case 10:
            return 0;
        }
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1002173.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号