插入排序&归并排序&堆排序

插入排序

#include<stdio.h>
void insertion_sort(int *arr,int len){
    int i,j;
    int temp;
    for(int i=1;i<len;i++){
        temp=arr[i];
        j=i-1;
        for(;j>=0 && arr[j]>temp;j--){
            arr[j+1]=arr[j];
        }
        arr[j+1]=temp;
    }
}
int main(){
    int a[5]={1,7,3,8,5};
    int n=5;
    insertion_sort(a,n);
    for(int i=0;i<n;i++)
        printf("%d ",a[i]);
}

归并排序

#include<cstdio>
void merge_sort_recursive(int *arr,int *reg,int start,int end){
    if(start >= end)
        return;
    int len=end-start,mid=(len>>1)+start;
    int start1=start,end1=mid;
    int start2=mid+1,end2=end;
    merge_sort_recursive(arr,reg,start1,end1);
    merge_sort_recursive(arr,reg,start2,end2);
    int k=start;
    while(start1 <=end1 &&start2 <=end2){
        reg[k++]=arr[start1]<arr[start2]?arr[start1++]:arr[start2++];
    }   
    while(start1<=end1)
        reg[k++]=arr[start1++];
    while(start2<=end2)
        reg[k++]=arr[start2++];
    for(int k=start;k<=end;k++)
        arr[k]=reg[k];
}
void merge_sort(int *arr,int len){
    int reg[len];
    merge_sort_recursive(arr,reg,0,len-1);
}
int main(){
    int a[5]={1,7,3,8,5};
    int n=5;
    merge_sort(a,n);
    for(int i=0;i<n;i++)
        printf("%d ",a[i]);
}

堆排序(以最小堆为例)

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define maxn 100
#define inf 1<<30
typedef struct Heap{
    int data[maxn];
    int sz; 
}heap;

//最小堆初始化,数组从1开始存储 
heap* init(heap *h){
    for(int i=0;i<maxn;i++)
        h->data[i]=inf;
    h->sz=1;
    return h;
}


//向最小堆中插入元素 ,时间复杂度为O(n) 
heap* insert(heap* h,int v){
    //printf("current size=%d \n",h->sz);
    h->data[h->sz]=v;
    for(int i=h->sz;i>=1;i--){
        // i 节点 不违背 Heap Property , continue 
        if( (h->data[i]<=h->data[i<<1]&&h->data[i]<=h->data[i<<1|1]) ){
            continue;
        }
        // i 节点 违背 Heap property , i节点 与 左右孩子中 值较小的孩子交换 
        else if(h->data[i]>h->data[i<<1] || h->data[i]>h->data[i<<1|1]){
            int j= h->data[i<<1]<h->data[i<<1|1]?i<<1:i<<1|1;  //取左右孩子中 值较小孩子的序号 
            int tmp=h->data[i];
            h->data[i]=h->data[j];
            h->data[j]=tmp;
        }       
    }
    h->sz++;
    //printf("sz=%d\n",h->sz);
    return h;

} 
// 将最小堆中最小的元素取出 ,时间复杂度为O( log(n) ) 
heap* extract_min(heap *h){
    int i=h->sz-1; //原来数组中最后一个元素
    h->data[1]=h->data[i];// 将序号为1的元素的值最后一个元素的值 
    h->data[i]=inf; // 销毁 
    for(int i=1 ; ; ){
        if(h->data[i] <= h->data[i<<1] && h->data[i<<1|1]){
            break;
        }
        int j=h->data[i<<2]<h->data[i<<2|1]?h->data[i<<1]:h->data[i<<1|1];
        int tmp=h->data[i];
        h->data[i]=h->data[j];
        h->data[j]=tmp;
        i=j;
    }
    h->sz--;
    return h;
}
//输出最小堆中各个元素 
void show(heap *h){
    if(h->sz==1){
        printf("The heap is empty\n");
        return;
    }
    else{
        printf("show:\n");
        for(int i=1;i<h->sz;i++)
            printf("%d ",h->data[i]);
        printf("\n");
    }
}
int main(){
    heap *h=(heap*)malloc(sizeof(heap));
    h=init(h);

    //插入一个元素 ,show,然后删除最后一个元素 ,检查 
    /*
    insert(h,5);
    show(h);
    extract_min(h);
    show(h);
    */

    //  插入多个元素,检查是否建立最小堆是否成功 

    int a[8]={1,3,5,7,4,6,8,2};
    for(int i=0;i<8;i++){
        insert(h,a[i]);
    }
    show(h);
    extract_min(h);
    show(h);    
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值