C++快速排序

最常用的排序——快速排序

快速排序和冒泡排序的原理是差不多的,但是快速排序交换位置是跳越的,所以有些时候它的复杂程度会优于冒泡排序。它的最差时间复杂度为O(N^2),但是它的平均复杂度为O(N*logN)。

首先,我们来对一组数进行排序
6 1 2 7 9 3 4 5 10 8
第一步,创立一个数组ar[10],我们需要寻找一个基准数,我们就规定最左边一个数为基准数。
6 1 2 7 9 3 4 5 10 8
然后从两边开始搜索(如果基准数在左边,就先从右边搜索,反之则搜索顺序反过来),把比基准数小的放在左边,比基准数大的放在右边。
i=0 j=9
从j- -开始
j=9 ar[j]=8 —— j=8 ar[j]=10 —— j=7 ar[j]=5比6小
然后开始i++
i=0 ar[i]=6 —— i=1 ar[i]=1 —— i=2 ar[i]=2 —— i=3 ar[i]=7比6大
最后交换此时ar[i]和ar[j]的数,顺序就变为
6 1 2 5 9 3 4 7 10 8

然后从这个位置接着进行搜索,直到i和j相等。
从j- -开始
j=7 ar[j]=7 —— j=6 ar[j]=4比6小
然后i++
i=3 ar[i]=5 —— i=4 ar[i]=9比6大
最后交换此时ar[i]和ar[j]的数,顺序就变为
6 1 2 5 4 3 9 7 10 8

然后继续
从j- -开始
j=6 ar[j]=9 —— j=5 ar[j]=3比6小
然后i++
i=4 ar[i]=5 —— i=5 此时i=j
所以交换基准数与ar[i]或者ar[j]交换
最后得到顺序为
3 1 2 5 4 6 9 7 10 8
这样6就在第6位上,所以6的位置就排好了。
我们再分别排6的左右两边,也就是3 1 2 5 4和9 7 10 8就好了。
这里我们用递归的思想就可以。

完整代码

#include<iostream>
using namespace std;
int ar[101],n; //定义全局数组
void quick_sort(int left,int right)
{    
	while(left>right)    
	{        return;
	 }    
	 int i,j,temp,tt;   
	 temp=ar[left];//把最左边的定义为基准数    
	 i=left,j=right;    
	 while(i!=j)   
	 {        
	 	while(ar[j]>=temp &&i<j)//先从右往左搜索        
	 	{           
	 		j--;        
	 	}        
	 	while(ar[i]<=temp &&i<j)//再从左往右搜索       
	 	{            
	 		i++;        
	 	}        
	 	if(i<j)//如果没有碰到,就交换位置        
	 	{            
	 		tt=ar[i];            
	 		ar[i]=ar[j];            
	 		ar[j]=tt;        
	 	}    
	}
	ar[left]=ar[i];//交换基准数的位置    
	ar[i]=temp;        
	quick_sort(left,i-1);    
	quick_sort(i+1,right);
}
int main()
{    
	scanf("%d",&n);    
	for(int i=1;i<=n;i++)    
	{        
		scanf("%d",&ar[i]);    
	}
    	quick_sort(1,n);    
    	for(int i=1;i<=n;i++)    
    	{        
    		printf("%d ",ar[i]);    
    	}    
    	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值