快速排序

快排是对冒泡排序的一种改进,是目前认为最好的内排序算法之一。
核心思想:在当前排序的序列(ks,ks+1,…,kt)中任意选择一个元素作为分界元素或者基准元素,把小于或等于分界元素的所有元素都移到分界元素前面,把大于或等于的所有元素移到分界元素后边。这样,分界元素正好处在排序的最终位置上,并且把当前排序的序列划分成前后两个子序列(前一个子序列中所有元素都小于或等于分界元素,后一个子序列中的元素都大于或等于分界元素)。然后再对上述子序列递归地进行上述过程

#include <stdio.h>
#include <string.h>
int a[] = {49,38,65,97,76,13,27,49};
void QUICK_SORT(int a[],int l,int r){
	int i=l,j=r;
	int key = a[l]; //不能是a[0],子序列开头的元素不一定是a[0]
	if (i>=j) //缺少该if条件,将进入无限循环
	{
		return;
	}
	while(i<j){
		while(a[j]>=key && i<j)
			j--;   //找到小于key的值,替换他
		a[i] =a[j];

		while(a[i]<key && i<j)
			i++;  //原来的j位置上的值已经替换了i位置上的值,目前存在两个j位置上对应的值,用a[i]的值将他替换掉
		a[j] = a[i];
	}
	a[i] = key;


	QUICK_SORT(a,l,i-1);



	QUICK_SORT(a,i+1,r);

	
	

}
int main(){
	
	int n = (sizeof(a))/sizeof(int); //求数组的长度
	QUICK_SORT(a,0,n-1);

	for (int i=0;i<n;i++)
	{
		if (i==n-1)
		{
			printf("%d
",a[i]);
		}else{
			printf("%d ",a[i]);
		}
		
	}
	return 0;
}
原文地址:https://www.cnblogs.com/CCCrunner/p/11781679.html