插入排序
#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);
}