昨天学了冒泡排序,今天我们大家来学习一下快速排序。
在写这个之前,我也是察看了很多博客的,十分感谢博主http://www.cnblogs.com/morewindows/archive/2011/08/13/2137415.html
http://blog.csdn.net/morewindows/article/details/6684558
http://blog.sina.com.cn/s/blog_5c5bc9070100y4zv.html
——————————————————————————————————————————————————————————————————————————
快速排序
概念:采取了分治策略。思想是:1.先从数列中选取一个数作为基准数 2.在分区时,将比这个数大的数都放在这个数的右边,比他小的或等于他的都放在他的左边。
3.在对左右区间都分别重复第二步,直到各个区间只有一个数。
————————————————————————————————————————————————————————————————————————————
好理解的挖坑填数+分治法:
挖坑填数:
先给一个数组:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
72 | 6 | 57 | 88 | 60 | 42 | 83 | 73 | 48 | 85 |
这个数组中,我们随便选取一个数,比如说0位置的72,那么我们在程序中,初始设置i=0;j=9;X=a[i]=72;(我们把一个额外的坑作为中间倒腾的地方,假设为X,i,j分别表示位置)
刚开始我们把a[0]=72的值放到了X的坑里,那a[0]这个坑就已经空着了,数组变成了:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
6 | 57 | 88 | 60 | 42 | 83 | 73 | 48 | 85 |
那么我们是不是要找比72小的数填到他的左边, 比72的数大的放到他的右边?可以这样操作:j=9,从后往前找一个比72小的数放到a[0],我们发现当j=8时,48<72,所以我们把48填到a[0]的位置,程序描述为:a[0]=a[8],i++;数组变为:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
48 | 6 | 57 | 88 | 60 | 42 | 83 | 73 | 85 |
那么我们a[8]的位置空出来了,我们要找比72大的数了,我们从i开始向后找大于72的数,当i=3时,88>72,符合条件,那么我们把a[8]=a[3];j--;数组变为:
此时 i=3,j=8;X=72
我们再重复上面的步骤,当j=5时,我们发现42<72,a[3]=a[5],i++;
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
48 | 6 | 57 | 42 | 60 | 83 | 73 | 88 | 85 |
此时i=5;j=5;X=72;由于i=j,所以把X填到a[5]中,此时数组变为:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
48 | 6 | 57 | 42 | 60 | 72 | 83 | 73 | 88 | 85 |
接下来我们得递归了,对a[0]-a[4]区间,和a[6]-a[9]这两个子区间重复上述步骤。
好啦,接下来总结一下递归算法的文字描述吧:
1.i=L,j=R,将基数挖出形成第一个坑a[i];
2.j--;从后向前,找到一个比基数小的数,找到后把这个数填到a[i]中;
3.i++由前向后找到比它大的数,找到后把这个数挖出放到刚刚空出来的a[j]中;
4.重复2~3,直到i=j,将基数填到a[i]中。
明白了原理我们开始用代码实现一下吧:(实现暂时还没有运行~等后面我运行了在写。。。。。)
#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
void quicksort(int a[],int l,int r);
int main()
{
int a[10]={34,65,12,43,67,5,78,10,3,70};
int len=sizeof(a)/sizeof(int);
cout<<"the orginal array are"<<endl;
for(int i=0;i<len;i++)
{
cout<<a[i]<<',';
}
cout<<endl;
quicksort(a,0,len-1);
cout<<"the sorted array are"<<endl;
for(int i=0;i<len;i++)
{
cout<<a[i]<<',';
}
cout<<endl;
return 0;
}
void quicksort(int a[],int l,int r)
{
if(l<r)
{
int i=l;
int j=r;
int x;
x=a[l];
while(i<j)
{
while(i<j&&a[j]>x)
{
j--;
}
if(i<j)
{
a[i]=a[j];
i++;
}
while(i<j&&a[i]<x)
{
i++;
}
if(i<j)
{
a[j]=a[i];
j--;
}
}
a[i]=x;
quicksort(a,l,i-1);//递归调用
quicksort(a,i+1,r);
}
}
执行结果为: