快速排序
昨天在科协学长讲课,讲的就是快速排序,据他说这是以后我们面试时的一道必考题,算法很好。结果大一的我们当然是听得晕乎的半天才勉强搞懂,今天按照学长的指导,在一个小时后终于拿下。
以下是学长写的一个伪码:
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;
}
与大家分享。