您的位置:首页 > 编程语言 > C语言/C++

C语言:快速排序

2013-11-23 15:34 323 查看

快速排序

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

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

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
;
//声明子函数
void Quicksort ( int, int, int );
int paitition(int, int, int);
//快速排序
int main()
{
//定义常量
int a
,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
;
//声明子函数
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
;

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

//快速排序
int main()
{
//定义常量
int a
,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;
}


   

        与大家分享。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 快速排序