C语言:快速排序

快速排序

       昨天在科协学长讲课,讲的就是快速排序,据他说这是以后我们面试时的一道必考题,算法很好。结果大一的我们当然是听得晕乎的半天才勉强搞懂,今天按照学长的指导,在一个小时后终于拿下。


以下是学长写的一个伪码:

Quicksort(A, p, r)

            if  p < r

                 q = paitition(A, p, r)

                                  Quicksort(A, p, q - 1)
                 Quicksort(A, q - 1, r)


paitition(A, p, r)

           x = A[r]

i = p - 1

for j = p to r - 1

if A[j] <= x

i = i +1

exchange A[i] with A[j]

exchange A[i + 1] with A[j]

return i + 1

       其中Quicksort函数中使用递归方式,将数列在paitition函数不断以A[r]为标准进行比较,分成比A[r]大的和比A[r]小的两个数列,将A[r]插在两个数列之间,然后在一遍遍重复直到将每一个数字分成一个数列, if  p < r不能满足,递归结束,排序完成。

/*快速排序:升序*/
#include <stdio.h>
#include <stdlib.h>
#define N 5
//定义外部变量
//int a[N];
//声明子函数
void Quicksort ( int, int, int );
int paitition(int, int, int);
//快速排序
int main()
{
    //定义常量
    int a[N],i, x;

    //输入数组
    printf("请输入%d个数:", N);
    for(i = 0; i < N; i++)
    {
        scanf("%d", &a[i]);
    }

    //调用子函数
    Quicksort ( a, 0, 4);

    //数组输出
    for(x = 0; x < N; x++)
    {
        printf("%5d", a[x]);
    }

    return 0;
}

//定义子函数  使用递归思想
void Quicksort(int a[], int p, int r)
{
    int q;

    if(p < r)
    {
        q = paitition( a, p, r);
        Quicksort (a, p, q - 1);
        Quicksort (a, q + 1, r);
    }
}

//定义子函数   进行一次排序
int paitition(a, p, r)
{
    int i, j, t;

    i = p - 1;
    //开始排序
    for(j = p; j < r; j++)
    {
        if(a[j] <= a[r])
        {
            i++;
            t = a[j];
            a[j] = a[i];
            a[i] = t;
        }
    }

    t = a[i + 1];
    a[i + 1] = a[r];
    a[r] = t;

    return i + 1;
}
         以上是我第一次的代码,但是问题很多,于是将数组改为外部变量如下:

/*快速排序:升序*/
#include <stdio.h>
#include <stdlib.h>
#define N 5
//定义外部变量
int a[N];
//声明子函数
void Quicksort ( int, int, int );
int paitition(int, int, int);
//快速排序
int main()
{
    //定义常量
    int i, x;

    //输入数组
    printf("请输入%d个数:", N);
    for(i = 0; i < N; i++)
    {
        scanf("%d", &a[i]);
    }

    //调用子函数
    Quicksort ( N, 0, 4);

    //数组输出
    for(x = 0; x < N; x++)
    {
        printf("%5d", a[x]);
    }

    return 0;
}

//定义子函数  使用递归思想
void Quicksort(int N, int p, int r)
{
    int q;

    if(p < r)
    {
        q = paitition(N, p, r);
        Quicksort (N, p, q - 1);
        Quicksort (N, q + 1, r);
    }
}

//定义子函数   进行一次排序
int paitition(A, p, r)
{
    int i, j, t;

    i = p - 1;
    //开始排序
    for(j = p; j < r; j++)
    {
        if(a[j] <= a[r])
        {
            i++;
            t = a[j];
            a[j] = a[i];
            a[i] = t;
        }
    }

    t = a[i + 1];
    a[i + 1] = a[r];
    a[r] = t;

    return i + 1;
}

 

       

        程序运行顺利,但是第一次的代码的错误原因还不知道,技术较差,老师指点后改正:


 

/*快速排序:升序*/
#include <stdio.h>
#include <stdlib.h>
#define N 5

//定义外部变量
//int a[N];


void Quicksort ( int a[], int, int );
int paitition(int a[], int, int);

//快速排序
int main()
{
    //定义常量
    int a[N],i, x;

    //输入数组
    printf("请输入%d个数:", N);
    for(i = 0; i < N; i++)
    {
        scanf("%d", &a[i]);
    }

    //调用子函数
    Quicksort ( a, 0, 4);

    //数组输出
    for(x = 0; x < N; x++)
    {
        printf("%5d", a[x]);
    }

    return 0;
}

//定义子函数  使用递归思想
void Quicksort(int a[], int p, int r)
{
    int q;

    if(p < r)
    {
        q = paitition( a, p, r);
        Quicksort (a, p, q - 1);
        Quicksort (a, q + 1, r);
    }
}

//定义子函数   进行一次排序
int paitition(int a[],int p,int r)
{
    int i, j, t;

    i = p - 1;
    //开始排序
    for(j = p; j < r; j++)
    {
        if(a[j] <= a[r])
        {
            i++;
            t = a[j];
            a[j] = a[i];
            a[i] = t;
        }
    }

    t = a[i + 1];
    a[i + 1] = a[r];
    a[r] = t;

    return i + 1;
}


   

        与大家分享。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值