記錄一些排序算法

記錄一些排序算法的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);
	}
}




待續。。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章