三种排序算法的C语言实现--直接插入、希尔、堆排序

直接插入排序
排序思想:
每步将一个待排序的对象,按其关键字大小,插入到前面已经有序的一组对象的适当位置上,直到剩余对象全部插入为止。

#include <stdio.h>
#define Max 20
int main(){
    int a[Max];
    int n,k,j,i;
    printf("请输入要排序的数的个数:"); 
    scanf("%d",&n);
    printf("请输入要排序的数:\n");
    for(i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    for(i=1;i<n;i++){
        k=a[i];
        for(j=i-1;j>=0&&k<a[j];j--){
            a[j+1]=a[j];//依次后移
        }
        a[j+1]=k;
    }
    printf("排序后的数为:\n");
    for(i=0;i<n;i++){
        printf("%d ",a[i]);
    }
    return 0;
}

希尔排序
排序思想:
先将整个待排记录序列分割成若干子序列(按照每一趟的增量dk),分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。增量dk逐趟缩短(例如依次取dk =5,3,1)

#include <stdio.h>
#define Max 20
void ShellInsert(int a[],int dk,int n){
    int i,j;
    for(i=dk+1;i<=n;i++){
        if(a[i]<a[i-dk]){
            a[0]=a[i];
            for(j=i-dk;j>0&&a[0]<a[j];j-=dk)
            a[j+dk]=a[j];
            a[j+dk]=a[0];
        }
    }
}
void ShellSort(int a[],int d[],int dk,int n){
    int k;
    for(k=0;k<dk;k++)
    ShellInsert(a,d[k],n);
} 
int main(){
    int a[Max],d[Max];
    int n,k,j,i,dk;
    printf("请输入要排序的数的个数:"); 
    scanf("%d",&n);
    printf("请输入要排序的数:\n");
    a[0]=0;
    for(i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    printf("请输入要划分的子序列次数:");
    scanf("%d",&dk);
    printf("请输入每次的子序列大小:");
    for(i=0;i<dk;i++)
    {
        scanf("%d",&d[i]);
    }
    ShellSort(a,d,dk,n);
    printf("排序后的数为:\n");
    for(i=1;i<=n;i++){
        printf("%d ",a[i]);
    }
    return 0;
    }

堆排序
排序算法:
先构建一棵大顶堆,输出堆顶元素,将最后一个节点放到堆顶,重新调整为大顶堆,再输出堆顶元素。重复上述步骤直至完毕。

#include <stdio.h>
#define Max 20 
int HeapAdjust (int a[],int s,int m){
    int rc,j,temp;
    rc=a[s];
    for(j=2*s;j<=m;j*=2){
        if(j<m&&(a[j]<a[j+1]))
        j++;
        if(!(rc<a[j]))
        break;
        temp=a[j];
        a[j]=a[s];
        a[s]=temp;
        s=j;
    }
}
void HeapSort(int a[],int n){
    int i;
    for(i=n/2;i>0;i--){
    HeapAdjust(a,i,n);
    }
    for(i=n;i>1;i--){
        printf("%d ",a[1]);
        a[1]=a[i];
    HeapAdjust(a,1,i-1);
    }
} 
int main(){
    int a[Max];
    int n,k,j,i;
    printf("请输入要排序的数的个数:"); 
    scanf("%d",&n);
    printf("请输入要排序的数:\n");
    a[0]=0;
    for(i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    printf("排序后的数为:\n");
    HeapSort(a,n);
    return 0;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值