分治算法之快速排序。

今天老师提了下快排,借此机会来复习下分治算法。希望大家能从中取得收获,如果有错误,也请大家指正。
分治算法,就是将一个大问题分成若干个小问题逐一求解。然后,这些小问题的解合并又可以得到总问题的解。
这就是分治算法的思想。

对于分治算法。比较典型的有 归并排序和快速排序和二分查找。这些都是效率挺高的算法。
在C++中,我们有头文件algorithm可以直接使用。但我们应该要把其中的过程给理清。
好好体会分治算法的精髓。这里,我就举快速排序来说。

其思路就是一个分治型的:
1.先设置数组中第一个数k,也就是k=a[0],经过一次操作后。让它排在它应该所在的位置。即先将一个数排好,比k大的在k的右边,比k小的在k的左边。
2.把k左边的部分快速排序
3.把k右边的部分快速排序。
于这个操作要怎么做呢?还是用代码来理解吧。

//主要看quciksort里的部分
#include<iostream>
using namespace std;

int a[100];
void swap(int &a,int &b){//C++里的一个范畴,传引用,如果不懂没关系
 int temp=a;            //只要知道这个可以交换a和b的值就行
 a=b;
 b=temp; 
}
void quicksort(int a[],int s,int e){    //快速排序a数组,范围为a[s]~a[e]
 if(s>=e)return;     //如果左下标>=右下标。说明排序已完成。直接返回。
 int i=s,j=e,k=a[s];    //前后各设一个标记。用于比较判断。
 while(i!=j){          //每次while都会将一个数置为有序粽
 while(i<j&&a[j]>=k)   //当k右边的数a[j]<k时,while结束,swap交换值。
 j--;
 swap(a[i],a[j]);
 while(i<j&&a[i]<=k)     // 执行这个操作时,k已经与a[j]交换了值                   
                         //当k左边的数a[i]>k,while结束,再一次交换值
 i++;
 swap(a[i],a[j]);  
 }/每执行一次quicksort都让一个数有序。
 quicksort(a,s,i-1);
 quicksort(a,i+1,e);
 
}
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
quicksort(a,0,n-1);
for(int i=0;i<n;i++)
printf("%d",a[i]);
return 0;  
} 

总之,快速排序一种高效率的排序方法,需要用到递归。这使得初看起来比较难理解,但是没关系,
实在不会,学到一个大概的思想也是好的,这对后续学习也多多少少有帮助。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值