堆排序和插入排序

#include<stdio.h>

//堆排序

void reheap(int arr[],size_t n,size_t index){
if(index>=n)
return;
int key = arr[index];
int child = 2index+1;
while(child < n){//子节点存在
if(child+1 < n && arr[child+1]>arr[child]){
++child;
}
if(arr[child]>key){
arr[index] = arr[child];
index = child;
child = 2
index+1;
}else{
break;
}
}
arr[index] = key;
}

//堆 大栈堆 小栈堆 完全二叉树
void heap_sort(int arr[],size_t n){
int i;
for(i=n/2-1;i>=0;–i){
reheap(arr,n,i);
}
for(i=n-1;i>0;i–){
swap(&arr[0],&arr[i]);
reheap(arr,i,0);
}
}

//插入排序

void insert_sort(int arr[],size_t n){
int i,j;
for(i=1;i<n;i++){//数组元素逐一往前插入
int key = arr[i];
for(j=i-1;j>=0&&arr[j]>key;j–){
arr[j+1] = arr[j];
}
if(j+1!=i)
arr[j+1] = key;
}

}

//折半插入

void bin_insert_sort(int arr[],size_t n){
int i,j;
for(i=1;i<n;i++){
int key = arr[i];
int left = 0,right = i-1;
while(left <= right){
int mid = (left+right)/2;
if(key<arr[mid]){
right = mid-1;
}else{
left = mid+1;
}
}
for(j=i-1;j>right;–j){//j>=left
arr[j+1] = arr[j];
}
arr[right+1] = key;//arr[left] = key;
}
}

//希尔排序

void shell_sort(int arr[],size_t n){
int i,j,step;
//step同组内元素之间距离
for(step = n/2;step>0;step=step/2){
//[0,step-1]每一组的第一个元素
for(i=step;i<n;i++){//不管是哪一个组的元素
int key = arr[i];
for(j=i-step;j>=0&&arr[j]>key;j-=step){
//组内插入
arr[j+step] = arr[j];
}
if(j+step != i)
arr[j+step] = key;
}
}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值