基本快速排序算法

快速排序(Quicksort)是对冒泡排序的一种改进
基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小(相当于找到一个中间值,这个中间值的左边数据都比它小,右边都比它大),然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

数据分割:
设一维数组Array[l…h],初始时候将其分割为两部分Array[l…r]和Array[r…h];
设置一基准值Array[i],一般我们设为数组首元素即Array[0];
设置两个下标变量i=0,j=h,让j从j-1开始向左边扫描,直到遇到比基准值]小的数Array[j],交换两个数据,此时基准值左边数为比自己小的数,然后i从i+1处向右边扫描,直到遇到比基准值大的数Array[i],交换两个数据,此时基准值右边的数为比自己大的数。

一趟快速排序的算法:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作中间数据,赋值给median,即median=Array[0];
3)从j开始向左边界搜索,即由后开始向前搜索(j–),找到第一个小于median的值Array[j],将Array[j]和Array[i]互换;(Array+i)=(Array+j);
4)从i开始向右边界搜索,即由前开始向后搜索(i++),找到第一个大于median的Array[i],将Array[i]和Array[j]互换;(Array+j)=(Array+i);
5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中Array[j]不小于median,4中Array[i]不大于median的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)

实现代码:

#include <stdio.h> 

int Partition(int *Array,int i,int j);
int Quicksort(int *Array,int l,int h);

int main()
{
	int i,n;
	int Array[255];
	printf("请输入数据个数:");
	scanf("%d",&n);
	if(n<=0||n>255)
	{
		printf("输入数据不正确!\n");
		exit(1);
	}
	printf("请依次输入待排序数据:\n");
	for(i=1;i<=n;i++)
		scanf("%d",(Array+i));
	printf("\n快速排序后结果:\n");
	Quicksort(Array,1,n);
	for(i=1;i<=n;i++)
		printf("%d",*(Array+i));
	printf("\n");
}

//快速排序分割算法
//*Array:待排序数组;
//i,j:数组左右边界

int Partition(int *Array,int i,int j)
{
	int median;
	median=*(Array+i);
	while(i<j)
	{
		while(i<j&&*(Array+j)>=median)
			j--;//从右向左扫描,直到找到第一个小于median的Array[j]
		*(Array+i)=*(Array+j);
		while(i<j&&*(Array+i)<=median)
			i++;//从左向右扫描,直到找到第一个大于median的Array[i]
		*(Array+j)=*(Array+i);
	}
	*(Array+i)=median;//最后定位基准位置
	return i;
}

//快速排序递归算法
//*Array:待排序数组
//l,h:数组左右边界

int Quicksort(int *Array,int l,int h)
{
	int mid;
	if(l<h)
	{
		mid=Partition(Array,l,h);
		Quicksort(Array,l,mid-1);
		Quicksort(Array,mid+1,h);
	}
}


	
	


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值