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语言的qsort 以及 C++的 sort
- C语言实现基本排序算法----排序(直接插入排序,SHELL排序,冒泡排序,快速排序,简单选择排序,堆排序)
- C语言:数组排序(插入排序、选择排序、泡排序、谢尔排序、快速排序、堆排序)
- 纯C语言:分治快速排序源码分享
- 快速排序的C语言源代码与分析
- 快速排序,C语言实现
- 数据机构快速排序之c语言实现
- C语言快速排序的例子
- 快速排序C语言源程序分析
- C语言快速排序
- C语言实现快速排序
- leecode 169. Majority Element(C语言,快速排序,堆排序,各类排序算法复杂度比较)22
- C语言 递推与递归 数据结构实验之排序八:快速排序
- 快速排序(C语言)
- 冒泡排序,插入排序,选择排序和快速排序-C语言
- 快速排序(Quick Sort)的C语言实现
- c语言排序实例(选择、冒泡、插入、折半、快速)
- 快速排序--C语言
- 快速排序的C语言实现及其时间复杂度
- 快速排序和二分查找算法的实现C语言