和我一起从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; 
}

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

以上。

原文地址:https://www.cnblogs.com/mxwbq/p/6686209.html