算法基础篇3

算法基础,排序之快速排序。

基本原理

  • 1.设定一个基准数(用来参照的数)。

  • 2.将基准数移到序列的中间位置(左边的数都小于它,右边的数都大于它)。

  • 3.以这个基准数为界将这个序列分为两部分,对每一部分进行第一步的操作。(分部之后的过程就要用到递归的思想)

  • 4.结束,输出结果

  • 具体流程请看流程图
    在这里插入图片描述

难点

  • 如何将基准数放到序列中间? 方法就是:从序列的两端分别设定两个小球 i , j ,让它们分别从两端开始相向滚动,当 j
    碰到一个比基准数小的停下来(一定要让 j 先滚动),i 再碰到一个比基准数大的数,将 i 和 j
    所指向的元素交换,两小球继续相向滚动,直到两小球相遇的时候结束,交换基准数和 i 所指向的元素,一轮结束。
  • 递归思想的应用。

好了说了这么多,先上代码:

#include<stdio.h>
int n,a[101];//定义全局变量

void quicksort(int left,int right)
{
	int i,j,temp,t;
	if(left>right)
	return;
	t=a[left];//设定基准数
	i=left;
	j=right;
	while(i!=j)
	{
		while(a[j]>=t&&i<j)//先让j移动
		j--;
		while(a[i]<=t&&i<j)//i再移动
		i++;
		//找到符合要求的两个元素,交换他们在数组中的位置
		if(i<j)//当两个小球没有相遇时
		{
			temp=a[i];
			a[i]=a[j];
			a[j]=temp;
		}
	 } 
	 //让基准数到达中间
	 a[left]=a[i];
	 a[i]=t;
	 //接下来重点来了
	 //递归思想的应用
	 quicksort(left,i-1);//继续处理左边的 
	 quicksort(i+1,right);//继续处理右边的 
	return ;
 } 
 
 int main ()
 {
 	int i,j;
 	scanf("%d",&n);
 	for(i=1;i<=n;i++)
 	scanf("%d",&a[i]);
 	quicksort(1,n);//快速排序函数调用
	//输出结果
	for(i=1;i<=n;i++)
	printf("%d ",a[i]);
	
	getchar();getchar();
	return 0; 
 }

输入数值验证

10
5 4 8 2 0 1 6 8 3 7

运行结果如下:

0 1 2 3 4 5 6 7 8 8

备注

  • 那么从大到小又怎么排呢?

    很简单只需要改变最后一步 a[i] 数组从 1 到 n ;i++改为从 n 到 1 ;i–就可以了(是不是很简单)

  • 我自己的理解都在这了 希望对你有所帮助!

发布了12 篇原创文章 · 获赞 0 · 访问量 723

猜你喜欢

转载自blog.csdn.net/weixin_43252204/article/details/83588087