记录一些排序算法的c代码
插入排序O(n^2)
void InsertSort(int *a)
{
int i,j,key;
for(j=2;j<=a[0];j++)
{
key=a[j];
i=j-1;
while(i>0&&a[i]>key)
{
a[i+1]=a[i];
i=i-1;
}
a[i+1]=key;
}
}
归并排序O(nlgn)
#define MAX 101
void merge(int *a,int p,int q,int r)
{
int n1,n2,L[MAX],R[MAX],i,j,k;
n1=q-p+1;L[0]=n1;
n2=r-q;R[0]=n2;
for(i=1;i<=n1;i++)
L[i]=a[p+i-1];
for(j=1;j<=n2;j++)
R[j]=a[q+j];
i=j=1;
k=p;
while(i<=n1&&j<=n2)
{
if(L[i]<=R[j])
{
a[k]=L[i];
i++;
k++;
}
else
{
a[k]=R[j];
j++;
k++;
}
}
if(i==(n1+1))
{
for(k;k<=r;k++)
a[k]=R[j++];
}
else if(j==(n2+1))
{
for(k;k<=r;k++)
a[k]=L[i++];
}
}
/*
void merge(int *a,int p,int q,int r)
{
int n1,n2,L[MAX],R[MAX],i,j,k;
n1=q-p+1;L[0]=n1;
n2=r-q;R[0]=n2;
for(i=1;i<=n1;i++)
L[i]=a[p+i-1];
for(j=1;j<=n2;j++)
R[j]=a[q+j];
L[n1+1]=999999;
R[n2+1]=999999;
i=j=1;
for(k=p;k<=r;k++)
{
if(L[i]<=R[j])
{
a[k]=L[i];
i++;
}
else
{
a[k]=R[j];
j++;
}
}
} */
void mergesort(int *a,int p,int r)
{
int q;
if(p<r)
{
q=(p+r)/2;
mergesort(a,p,q);
mergesort(a,q+1,r);
merge(a,p,q,r);
}
}
int BinarySearchSp(int *a,int p,int q,int v)
{
int m=(p+q)/2;
if(p>=q&&v<a[p])
return p;
if(p>=q&&v>a[p])
return p+1;
else if(v==a[m])
return m-1;
else if(v<a[m])
return BinarySearchSp(a,p,m-1,v);
else if(v>a[m])
return BinarySearchSp(a,m+1,q,v);
}
void BinaryInsertSort(int *a)
{
int i,j,key,k;
for(j=2;j<=a[0];j++)
{
key=a[j];
k=BinarySearchSp(a,1,j-1,key);
for(i=j-1;i>=k;i--)
{
a[i+1]=a[i];
}
a[k]=key;
}
}
堆排序O(nlgn)
#include<stdio.h>
//HeapSort
//a[0]存储a.length,在排序过程中存储a.heap-size
void maxHeapify(int *a,int i)
{
int largest,l,r,temp;
l=2*i;
r=2*i+1;
if(l<=a[0]&&a[l]>a[i])
largest=l;
else
largest=i;
if(r<=a[0]&&a[r]>a[largest])
largest=r;
if(largest!=i)
{
temp=a[i];
a[i]=a[largest];
a[largest]=temp;
maxHeapify(a,largest);
}
}
void buildMaxHeap(int *a)
{
int i;
for(i=a[0]/2;i>=1;i--)
maxHeapify(a,i);
}
void heapSort(int *a)
{
int i,temp,length=a[0];
buildMaxHeap(a);
for(i=a[0];i>=2;i--)
{
temp=a[1];
a[1]=a[i];
a[i]=temp;
a[0]--;
maxHeapify(a,1);
}
a[0]=length;
}
快速排序及其随机化算法 最坏情况O(n^2)平均情况O(nlgn)
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
//QUICKSORT
int partition(int *a,int p,int r)
{
int x,i,j,t;
x=a[r];
i=p-1;
for(j=p;j<=(r-1);j++)
{
if(a[j]<=x)
{
i++;
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
t=a[i+1];
a[i+1]=a[r];
a[r]=t;
return i+1;
}
int randomizedPartition(int *a,int p,int r)
{
int i,t;
srand((unsigned)time(NULL));
i=rand()%(r-p+1)+p;
t=a[r];a[r]=a[i];a[i]=t;
return partition(a,p,r);
}
void quickSort(int *a,int p,int r)
{
int q;
if(p<r)
{
q=partition(a,p,r);
quickSort(a,p,q-1);
quickSort(a,q+1,r);
}
}
void randomizedQuickSort(int *a,int p,int r)
{
int q;
if(p<r)
{
q=randomizedPartition(a,p,r);
randomizedQuickSort(a,p,q-1);
randomizedQuickSort(a,q+1,r);
}
}
待续。。