快速排序的思想,如果说是分治法,那也不详细,我看到一个非常适合的描述就是“挖坑填数+分治法”
挖坑填数:就是从数组中取一个基数(就想一个标杆来和其他的数比较),赋值给temp变量,这样我们就不用担心它会丢失,就相当于我们把这个数先挖出来,留一个坑给其他的数字填充,其他的所有数都跟这个数比较,值得注意的是:如果我们取的是最左边(右边)的数,那么我们就要先从右边(开始比)。
分治:如果按照升序排列,那么我们就需要把右边所有比基数小的数,都一个个挪到数组左边,大的放在右边。在一遍循环下来以后,我们基数就在数组中间了,比基数小的就在左边,比基数大的在基数右边,就按照这个基数,把数组拆分为两组,然后重新对两组数继续上面的方法,直到数组中只有一个元素,这个时候数组就算排列好了。
简述过程:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
下面贴上代码:
#include <iostream>
using namespace std;
int a[100];
void quick_sort(int *a, int l ,int r){
int right = r, left = l;
if(r <= l)
return;//这里就是判断数组是不是只有一个元素
int x = a[l];//我们选择左边的作为基数
while(right > left){//
while(x <= a[right] && right > left){//先从右边比较,查找到数组右边比基数小的数的下标
right--;
}
if(left < right){//做交换赋值,把小的数放在数组左边
a[left++]=a[right];
}
while(x >= a[left] && right > left){//查找到数组左边比基数大的数的下标
left++;
}
if(left < right){//做交换赋值,把大的数放在数组右边
a[right--] = a[left];
}
}
a[right] = x;//最后要把基数赋值到最中间的那个位置
//对分成两组的数组分别排序
quick_sort(a,l,right-1);
quick_sort(a,right+1,r);
}
int main()
{
int sizea =0;
cin>>sizea;
for(int i = 0;i < sizea; i++){
cin>>a[i];
}
quick_sort(a,0,sizea-1);
for(int i = 0;i < sizea; i++){
cout<<a[i]<<" ";
}
return 0;
}
如果还是看不懂的话,那推荐一篇博文
http://blog.youkuaiyun.com/morewindows/article/details/6684558 欢迎小伙伴赐教
287

被折叠的 条评论
为什么被折叠?



