快速排序

快速排序

快速排序之所以比较快,是因为相比冒泡排序,每次交换是跳跃式的。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样只能在相邻的数之间进行交换,交换的距离就大得多了。因此总的比较和交换次数就少了,速度自然就提高了。当然在坏的情况下,仍可能是相邻的两个数进行了交换。因此快速排序的差时间复杂度和 冒泡排序是一样的,都是 O(N2),它的平均时间复杂度为 O (NlogN)。其实快速排序是基于一 种叫做“二分”的思想。

用一张图片描述:
在这里插入图片描述

代码:

#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);//继续处理右边的,这里是一个递归的过程  
}

int main() 
{     
	int i,j,t;     
	//读入数据      
	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]); 
     
    return 0; 
} 

假设输入为
10
6 1 2 7 9 3 4 5 10 8
下面是程序执行过程中数组 a的变化过程,带下划线的数表示的是已归位的基准数。
6 1 2 7 9 3 4 5 10 8
3 1 2 5 4 6 9 7 10 8
2 1 3 5 4 6 9 7 10 8
1 2 3 5 4 6 9 7 10 8
1 2 3 5 4 6 9 7 10 8
1 2 3 4 5 6 9 7 10 8
1 2 3 4 5 6 9 7 10 8
1 2 3 4 5 6 8 7 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值