快速排序算法

本文详细介绍了快速排序算法的工作原理,包括如何选取标志数据、数据的转移过程以及递归分治策略。提供了C语言实现的详细代码,包括数据交换函数和排序函数,展示了如何在不使用额外数组的情况下完成排序。通过递归调用sort函数,实现了数组的快速排序。

快速排序算法


算法思想:从待排序的数据中选取一个标志数据,把数组中比标志数据flag小的数据放在其左边,比标志数据大的放在右边。这样,只需要考虑数据转移的代码设计,当把这个标志数据的待排位置确定了,就把问题分为了两个子问题,是两个子问题的问题规模不相同,但是解决办法相同。同时,C语言实现的话,存在大量在数组之间的数值交换,不需要用到其他新的数组,并且在子问题中直接可以对原数据数组a[]进行交换数据,不需要有合并的操作。

递归边界代码:

if(i==j)
		return 0;
	if(i==j-1)
	{
		if(a[j]>a[i])
			return 0;
		if(a[j]<a[i])
		{
			swap(i,j,a);
			return 0;
		}
	}

数据转移代码:

if(m<n)
	{
		while(m!=n)
		{
			while(m<n&&a[n]>flag)
				n--;
			swap(n,m,a);
			while(m<n&&a[m]<flag)
				m++;
			swap(m,n,a);
		}

数据交换函数swap:

void swap(int a,int b,int c[])
{
	int S;
	S=c[a];
	c[a]=c[b];
	c[b]=S;
}

分治函数sort:

sort(i,m-1,a);
		sort(m+1,j,a);

总代码:

#include<stdio.h>
#include<windows.h>
void swap(int a,int b,int c[])
{
	int S;
	S=c[a];
	c[a]=c[b];
	c[b]=S;
}
int sort(int i,int j,int a[])
{
	int flag,m,n;
	if(i==j)
		return 0;
	if(i==j-1)
	{
		if(a[j]>a[i])
			return 0;
		if(a[j]<a[i])
		{
			swap(i,j,a);
			return 0;
		}
	}
	m=i;
	n=j;
	flag=a[i];
	if(m<n)
	{
		while(m!=n)
		{
			while(m<n&&a[n]>flag)
				n--;
			swap(n,m,a);
			while(m<n&&a[m]<flag)
				m++;
			swap(m,n,a);
		}
		sort(i,m-1,a);
		sort(m+1,j,a);
	}
}
void main(){
	int n,k,a[100];
	printf("输入问题规模:");
	scanf("%d",&n);
	printf("输入问题具体数字:\n");
	for(k=0;k<=n-1;k++)
		scanf("%d",&a[k]);
	sort(0,n-1,a);
	for(k=0;k<=n-1;k++)
		printf("%d  ",a[k]);
	system("pause");
}



	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值