利用分治法的排序算法比较

1.快速排序

代码:
int partition(int a[],int p,int r)
{
	int key = a[r];
	int i = p;
	int j = p;
	int t;
	while(j<r)
	{
		if(a[j] <= key)
		{
			
			t = a[i];
			a[i] = a[j];
			a[j] = t;
			i++;
		}
		j++;
	}
	t = a[i];
	a[i] = a[r];
	a[r] = t;
	return i;
} 
void quick(int a[],int p, int r)
{
	if(p<r)
	{
		int i = partition(a,p,r);
		quick(a,p,i-1);
		quick(a,i+1,r);
	}
}

快速排序的核心就是一个关键值,先确定一个key值,然后遍历整个数组,让数组分为两个部分,左边部分小于key值,右边部分大于key值(两部分元素数目可能不同,实际上经常不同);

然后就是递归该做的事了。

2.归并排序

排序2个元素的数组,比排序4个元素的数组简单吧,排序4个元素的数组,比排序八个元素的数组简单吧。归并排序干的就是这类的事情。将数组一步一步的变小,再合并;

void merge(int list1[], int list1Size,int list2[], int list2Size)
{
	int *list;
	int i=0,j=0,k=0;
	list = (int *)malloc(sizeof(int)*(list1Size+list2Size));
	while(i<list1Size && j<list2Size)
		list[k++] =  list1[i]<list2[j]?list1[i++]:list2[j++];
	while(i<list1Size)
		list[k++] = list1[i++];
	while(j<list2Size)
		list[k++] = list2[j++];
	i=-1; 
	while(++i<k)
	{
		list1[i] = list[i];
	}
	    
	free(list);
}
void mergesort(int list[],int listsize)
{
	
	if(listsize > 1)
	{
		int i,j;
		int *list1,*list2;
		i = listsize/2;
		j = listsize -i;
		list1 = list;
		list2 = list+i;
		mergesort(list1,i);
		mergesort(list2,j);
		merge(list1,i,list2,j);
	}
}

3.堆排序

堆排序利用了二叉树的性质,这里得提到一个性质最大堆,最大堆就是根节点大于等于 所有子节点。

先将整个数组处理为一个最大堆,然后交换首尾元素,再将第0位到第n-1位,处理为最大堆,再交换0号元素和n-1号元素。一直处理到0位;

void Heap_MAX(int a[], int i, int length)
{
	int nchild = 2*i+1;
	int ntemp;
	for(;2*i+1<length;i = nchild)
	{
		nchild = 2*i+1;
		if(nchild<length-1 && a[nchild] <a[nchild+1] )
		{
			nchild++;
		} 
		if(a[nchild]>a[i])
		{
			ntemp = a[nchild];
			a[nchild] = a[i];
			a[i] = ntemp;
		}
		else
		{
			break;
		}
	} 
	
}

void heapsort(int a[],int length)
{
	int i,temp;
	for(i=length/2-1;i>=0;i--)
	{
		Heap_MAX(a,i,length);
	}
	for(i=length-1;i>0;i--)
	{
		temp = a[i];
		a[i] = a[0];
		a[0] = temp;
		Heap_MAX(a,0,i);
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值