常用算法探微~快速排序

算法是编程的灵魂,可见其重要,开发者,无论学什么语言,都必须掌握常见的算法。今天,笔者就和大家分享下,对常见算法~快速排序法的理解,它是冒泡排序的一种该进。基本思想是:通过一遍排序将排序的数据划分为两个部分,使其中一部分,比另一部分数据小,然后再分别对这两部份数据继续进行这种排序,按此规则继续,知道每个部分为空,或者只含有一个数,整个快速排序结束。

算法描述

1)从数列中挑出一个元素,称该元素为基准。

2)扫描一遍数列,将所有比基准小的元素,排在基准前面,所有比基准大的元素排在基准后面

3)通过递归,将各个子序列划分为更小的序列,直到把小于基准值的子数列和大于基准的元素的子数列排序。

下面以一组代排序数列演示快速排序的过程,假设有8个需要排序的数据序列如下:

69,65,90,37,92,6,28,54

不妨设数组A存这八个数,其排序过程如下:

常用算法探微~快速排序_第1张图片

1、在变量left中保存数组最小的序号0,在变量right中存数组最大的序号7,在变量base中保存数组最后元素A【0】

2、从数组右侧开始,逐步取出元素与base比较,知道找到,比base小的数据为止

3、将右侧与基准小的数存到A【left】

4、从数组左侧开始逐步取出元素与base比较,知道找打比base大的数据为止,

5、将左侧比基准大的数保存A【right】

6、将base中保存的值保存到A【left】中,经过这些运算,得到上述第二个图,经过这次分割,base左侧即left所指向的数据,比base小,右侧比之大

7、接下来,通过递归调用,将left左侧数据进行同样的排序,,再将left右侧数据进行同样的排序

这样便可以完成排序操作,伪代码如下:

void 快速排序(数组,左侧序号,右侧序号)
{
      分割数组,将left保存到 i
      快速排序(数组,原左侧序号,i-1)
      快速排序(数组,i+1,原右侧序号)
}
C语言描述:

void QuickSort(int a[],int left,int right)
{
	int i,j;
	if(left
其中分割数组函数实现:

int Division(int a[],int left,int right)        
{
	int base=a[left];								//取左侧元素为基准元素
	while(leftbase)			//从右向左寻找第一个比基准小的元素
			--right;								
		a[left]=a[right];							//将比基准小的元素移到左侧
		while (left

完整源代码如下:

#include 
#include 
#define ARRAYLEN 10
int CreateData(int arr[],int n,int min,int max) //创建一个随机数组,a保存生成的数据,n为数组元素的数量 
{
    int i,j,flag;
    srand(time(NULL));
    if((max-min+1)base)
            --right;     //从右向左找第一个比基准小的元素
        a[left]=a[right];
        while(left

运行截图:




你可能感兴趣的:(数学问题,算法,黑马程序员,快速排序,算法)