快速排序算法

  • 最流行的的排序算法,速度最快的排序算法(递增顺序)
  • 1962年C.A.R.Hoarse发明的快速排序算法
  • pivot:枢轴,枢纽(基元素)
  • 递归方法


假设有N个元素序列,存放在数组,数组的索引号为1~n:

假设以第一个元素为枢轴元素(参考元素),即pivot=a[1],令两个索引下标 i=1;j=n

  • 从序列的最后一个位置,从左往右依次将当前元素的关键字与枢轴元素的关键字进行比较:

      如果当前元素的关键字大于或等于枢轴元素,往左边移动;

     如果当前元素的关键字小于枢轴元素,将当前位置的关键字s[j]与是s[i]进行交换;(s[i]符合以下情况)

  • 同时,从序列的第一个位置,从右往左依次将当前元素的关键字与枢轴元素的关键字进行比较:

     如果当前位置元素的关键字小于枢轴元素,往右边移动;

     如果当前元素的关键字大于枢轴元素,将当前位置的关键字s[i]与是s[j]进行交换;


直到i>j,退出循环;这样第一轮快速排序完成,枢轴元素变到数组的中间,右边是比它打的元素,左边是比它小的元素

对于右边和左边,使用递归的方法调用快速排序的函数!!


c实现代码如下

#include<stdio.h>
#include<stdlib.h>
void quicksort(int*s, int l, int r);
int main(void)
{
	int i;
	int k[] = { 8, 6, 4,23, 2, 0, 1, 3, 5, 7,68, 9 };
	quicksort(k,0,11);
	for (i = 0; i < 12; i++)
		printf("%d\t",k[i]);
	printf("\n");
	system("pause");
	return 0;
}
void quicksort(int *s, int l, int r)
{
	
	int i, j, pvoit;
	i = l; 
	j = r;
	if (l < r)
	{

		pvoit = s[i];
		while (i < j)
		{
			while (i<j&&s[j]>pvoit)
				j--;
			//从右向左来找,第一个小于枢轴元素pvoit的数
			if (i < j)
			{
				s[i] = s[j];
				i++;
			}
			while (i < j&&s[i] < pvoit)
				i++;
			if (i < j)
			{

				s[j] = s[i];
				j--;
			}
			//从左向右来找,第一个大于枢轴元素pvoit的数

		}
		s[i] = pvoit;
		//将枢轴元素移动到中间,位于它左边的元素都比它小,位于它右边的值,都比它大
		quicksort(s, l, i - 1);
		quicksort(s, i + 1, r);
	}

}




猜你喜欢

转载自blog.csdn.net/strive_0902/article/details/80224415