快速排序的两种实现

简介

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

运行结果:

这里写图片描述

严蔚敏版本快排

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值