C语言 数据结构 实验六 【自用】

这篇博客详细介绍了C语言实现的八种排序算法,包括直接插入、折半插入、希尔、冒泡、快速、简单选择、堆排序以及非递归的归并排序和基数排序,是作者的个人学习记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C语言 数据结构 实验六


8638 - 直接插入排序

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

void TraverseArray(int *ary, int n)
{
   
    int i;

    for(i = 0; i < n; i++)
        printf("%d ", ary[i]);

    printf("\n");
}

void simpleInsertSort(int *ary, int n)
{
   
    int i, j, temp;

    for(i = 1; i < n; i++)
    {
   
        if(ary[i] < ary[i-1])
        {
   
            temp = ary[i];

            for(j = i-1; j >= 0 && ary[j] > temp; j--)
            {
   
                ary[j+1] = ary[j];
            }

            ary[j+1] = temp;
        }

        TraverseArray(ary, n);
    }
}

int main()
{
   
    int i;
    int n;
    int *ary;

    scanf("%d", &n);
    ary = (int *)malloc(sizeof(int) * n);

    for(i = 0; i < n; i++)
        scanf("%d", ary+i);

    simpleInsertSort(ary, n);
}

/*
Description
用函数实现直接插入排序 并输出每趟排序的结果


--输入格式--
第一行:键盘输入待排序关键的个数n
第二行:输入n个待排序关键字 用空格分隔数据


--输出格式--
每行输出一趟排序结果 数据之间用一个空格分隔


--输入样例--
10
5 4 8 0 9 3 2 6 7 1


--输出样例--
4 5 8 0 9 3 2 6 7 1
4 5 8 0 9 3 2 6 7 1
0 4 5 8 9 3 2 6 7 1
0 4 5 8 9 3 2 6 7 1
0 3 4 5 8 9 2 6 7 1
0 2 3 4 5 8 9 6 7 1
0 2 3 4 5 6 8 9 7 1
0 2 3 4 5 6 7 8 9 1
0 1 2 3 4 5 6 7 8 9
*/


8639 - 折半插入排序

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

void TraverseArrary(int *ary, int n)
{
   
    int i;

    for(i = 0; i < n; i++)
        printf("%d ", ary[i]);

    printf("\n");
}

void binaryInsertSort(int *ary, int n)
{
   
    int i, j, temp;

    for(i = 1; i < n; i++)
    {
   
        if(ary[i] < ary[i-1])
        {
   
            temp = ary[i];

            int low=0, high=i-1, mid;

            while(low <= high)
            {
   
                mid = (low+high)/2;

                if(ary[mid] == temp)
                {
   
                    high = mid;
                    low = mid+1;
                    break;
                }
                else if(ary[mid] < temp)
                {
   
                    low = mid+1;
                }
                else if(ary[mid] > temp)
                {
   
                    high = mid-1;
                }
            }

            for(j = i-1; j > high; j--)
            {
   
                ary[j+1] = ary[j];
            }

            ary[j+1] = temp;
        }

        TraverseArrary(ary, n);
    }
}

int main()
{
   
    int i;
    int n;
    int *ary;

    scanf("%d", &n);
    ary = (int *)malloc(sizeof(int) * n);

    for(i = 0; i < n; i++)
        scanf("%d", ary+i);

    binaryInsertSort(ary, n);
}

/*
Description
用函数实现折半插入排序 并输出每趟排序的结果


--输入格式--
第一行:键盘输入待排序关键的个数n
第二行:输入n个待排序关键字 用空格分隔数据


--输出格式--
每行输出一趟排序结果 数据之间用一个空格分隔


--输入样例--
10
5 4 8 0 9 3 2 6 7 1


--输出样例--
4 5 8 0 9 3 2 6 7 1
4 5 8 0 9 3 2 6 7 1
0 4 5 8 9 3 2 6 7 1
0 4 5 8 9 3 2 6 7 1
0 3 4 5 8 9 2 6 7 1
0 2 3 4 5 8 9 6 7 1
0 2 3 4 5 6 8 9 7 1
0 2 3 4 5 6 7 8 9 1
0 1 2 3 4 5 6 7 8 9
*/


8640 - 希尔(shell)排序

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

void TraverseArray(int *ary, int n)
{
   
    int i;

    for(i = 0; i < n; i++)
        printf("%d ", ary
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值