简介
快速排序是排序中速度比较快的,采用分治策略,不断递归排序。很多编程语言的sort()或者qsort()函数的底层实现就是快排。
算法导论第7章对快速排序进行了深入的探讨,而且它的划分思想与国内的许多教材不同。如严蔚敏数据结构版本选择第一个元素为中枢,从左右两端往中间逼近;而算法导论则是选择最后一个元素为中枢,两个指针一起从左到右遍历一遍进行划分。(选择中枢也是个值得探讨的问题,算法导论采取随机法)
算法导论版快排
代码:
交换用的宏定义,数组初始化&输出函数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
#include <time.h>
#include<windows.h>
#define SWAP(a,b) do { temp = (a);\
(a) = (b);\
(b) = (temp);}while(0);
//随机生成N个整数
void init_array(int a[],int n)
{
int i ;
srand((int)time(NULL));
for (i=0;i<n;i++) //随机生成 0 - 100
{
a[i] = rand()%100 ;
}
printf("随机生成了 %d 个整数 \n",n);
for (i=0;i<n;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
//打印数组元素
void showArray(int a[],int n)
{
int i ;
printf("现在数组中的序列为:\n");
for (i=0;i<n;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
//************ 快速排序---算法导论思想前后指针 ******************
int sort_Patition_JBefore(int a[],int low ,int high)
{
int i,j;
int pivot = a[high]; //数组最后一个元素作为分割值
for (i=low-1,j=low; j < high ; j++)
{
if (a[j]<=pivot) // 注意 < 不可以,要<=
{
i++;
SWAP(a[i],a[j]);
}
}
SWAP(a[i+1],a[high]);
return i+1;
}
void QuickSort_Jbeofore(int a[],int low ,int high)
{
int pivot ;
if (low<high)
{
pivot = sort_Patition_JBefore(a,low,high);
QuickSort_Jbeofore(a,low,pivot-1);
QuickSort_Jbeofore(a,pivot+1,high);
}
}