JSMS43-QuickSort快速排序

259 阅读1分钟

快速排序具体是什么可以参考其它文章了,是非常典型的分而治之思想的算法
下面说说快排的实现的方式,看注释

#include <stdio.h> 
#include <stdlib.h>


void swap(int *a,int *b)
{
	int tmp=*a;
	*a=*b;
	*b=tmp;
}

void QuickSorts(int *a,int left,int right,int &count)
{
	if(left>right){              //如果左指针大于右指针,直接ret
		return;
	}	
	int l=left;      //l 暂时记录左指针
	int r=right;     //r 暂时记录右指针
	int privot=a[left];    //pivot当作中间值,取最左边的元素,然后就是大于pivot的放在数组右边,小于pivot放在左边
	while(l<r)    //进入循环
	{
		for(;r>l;--r)   //如果r>l,--r
		{
			if(a[r]<privot)  //if a[r]<privot
			{
				break;
			}
		}
		for(;l<r;++l)    //if 了<r ++l
		{
			if(a[l]>privot)  //a[l]>privot
			{
				break;
			}
		}
		if(l<r)    //这里如果l<r就交换两个数字,这样大于privot的就在右边,小于privot的就在左边
		{
			swap(&a[l],&a[r]);
			count++;
		}
	}
	swap(&a[left],&a[l]);   // 这一步是把privot放到确定的l的位置,也就是说privot最终的位置
	QuickSorts(a,left,l-1,count);  //递归的解决左半部分
	QuickSorts(a,l+1,right,count); //递归的解决右半部分
}

void Quick(int *a,int len)
{
	int count=0;    
	QuickSorts(a,0,len,count);
	
	
}
void PrintArray(int *a,int len)
{
	for(int i=0;i<len;i++)
	{
		printf("%d->",a[i]);
	}
	printf("\n");
}

int main()
{
	int a[]={1,456,789,12,0,12345,14,32,465,232};   //用于排序的数组
	int len=sizeof(a)/sizeof(a[0]);   //数组长度
	Quick(a,len-1);     //传进Quick里面套马甲,为啥是len-1,因为a[len]不存在元素
	PrintArray(a,len);		
}