和我一起从0学算法(C语言版)(二)

第一章 排序

第三节 快速排序

快速排序是最常用的排序方法。快排运用的递归方法很有意思。掌握了这种排序方法可以在将来学习递归时更快入门。只是快排的思路与之前的排序方法相比较为复杂,再加担心上我的表达能力会让让大家产生误解,所以推荐大家去看大牛的博客,我只给出代码,如果有不懂的同学,可以在评论留下问题,我会尽快回答的。

include<stdio.h>

int a[101],n; // 定义全局变量,这两个变量需要在子函数中使用

void quicksort(int left,int right) {
int i,j,t,temp;
if(left>right)
return;

temp=a[left]; // temp中存的就是基准数
i = left;
j = right;
while (i != j) {
// 顺序很重要,要先从右往左找
while (a[j]>=temp && i<j)
j--;
// 再从左往右找
while (a[i]<=temp && i<j)
i++;

// 交换两个数在数组中的位置
if (i<j) { // 当哨兵i和哨兵j没有相遇时
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
// 最终将基准数归位
a[left]=a[i];
a[i]=temp;

quicksort(left,i-1); // 继续处理左边的,这里是一个递归过程
quicksort(i+1,right); // 继续处理右边的,这里是一个递归过程
return;
}

int main() {
int i,j;
// 读入数据
scanf("%d",&n); // n代表有n个数据需要排序
for(i=0;i<n;i++)
scanf("%d",&a[i]);

quicksort(0,n-1); // 快速排序调用

// 输出排序后的结果
for(i=0;i<n;i++)
printf("%d ",a[i]);

return 0;
}

看上去是有点长,但是抽点时间研究下很好懂的。

以上。

posted @ 2017-04-09 20:21  梦想未必轻  阅读(135)  评论(0)    收藏  举报