快速排序算法C语言实现

快速排序算法C语言实现

在任何程序中,数组的排序都是极为重要的内容,我们需要按照业务需要对大量的数据进行排序,因此排序的速度或者说效率就显得极为重要了,因此选择一个效率较高的算法可以大大提升程序的性能。
如今的算法界,排序算法比较多,包括:冒泡排序,堆排序,选择排序,插入排序,交换排序等,而今天所说的快速排序(QuickSort)就是交换排序的一种,它具有快速,高效的特性而被经常使用,但它的时间复杂度也是级不稳定的,最好的情况下是O( nlogn ),最坏的情况下是O( n^2 )。
其排序的原理在于通过一趟排序,将待排序的记录分成独立的两部分,其中一部分的数据始终大于另一部分数据的值,然后在分别利用递归对这两部分进行排序,以达到整个序列的有序。
废话不多说,直接看C程序:
1.首先需要定义快速排序的递归式:

void QuickSort(ElemType arr[],int start,int end)
{
	if(start<end)
	{
	int key=(start+end)/2;
	key=Sort(arr,start,end,key);
	QuickSort(arr,start,key-1);
	QuickSort(arr,key+1,end);
	}
}

从代码中我们可以看出,首先需要确定一个关键点,这个点可以任意设置,一般设置成中间位置,然后先对序列进行一趟排序后,再利用递归对大于关键点的部分和小于关键点的部分进行排序。
2.子排序代码:

int Sort(ElemType arr[],int low,int high,int key)
{
	findmin(arr,&low,&high,&key);
	return key;
}
void findmin(ElemType arr[],int *low,int *high,int *key)
{
	if(low<high)
	{
		int pos=-1;
	for(int i=*high;i>=*low;i--)
	{
		if(arr[i]<=arr[*key])
		{
			pos=i;
			break;
		}
	}
	if(pos!=-1)
	{	
		*high=pos;
		Exchange(&arr[*high],&arr[*key]);
		*key=pos;
		int value=*high;
		value--;
		*high=value;

		findmax(arr,low,high,key);
	}
	}
}

void findmax(ElemType arr[],int *low,int *high,int *key)
{
	if(low<high)
	{
	int pos=-1;
	for(int i=*low;i<=*high;i++)
	{
		if(arr[i]>=arr[*key])
		{
			pos=i;
			break;
		}
	}
	if(pos!=-1)
	{
		*low=pos;
		Exchange(&arr[*low],&arr[*key]);
		*key=pos;

		int value=*low;
		value++;
		*low=value;

		findmin(arr,low,high,key);
	}
	}
}

一趟排序的算法为:
(1)设置low和high来表示序列的范围,从high开始向前寻找第一个小于关键点值的位置,然后与关键点进行交换.
(2)从low开始向后寻找第一个大于关键点值的位置,然后与关键点进行交换.
(3).。。。。。。。。。。一直这样递归下去知道low=high

3.进行程序的测试

int main()
{
	ElemType arr[]={11,26,2,5,158,176,2,4,6};
	int len=sizeof(arr)/sizeof(ElemType);
	print(arr,len);
	QuickSort(arr,0,len-1);
	printf("Quick Sort ....\n");
	print(arr,len);
	return 0;
}

最后输出结果为:
在这里插入图片描述
代码Github地址:https://github.com/xiaoqinzhao/QuickSort

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值