您的位置:首页 > 其它

快速排序的两种实现

2015-07-29 14:51 204 查看

简介

快速排序是排序中速度比较快的,采用分治策略,不断递归排序。很多编程语言的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);
}
}


运行结果:



严蔚敏版本快排

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: