#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 = 2index+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;
}
}
}