快速排序的思想,如果说是分治法,那也不详细,我看到一个非常适合的描述就是“挖坑填数+分治法”
挖坑填数:就是从数组中取一个基数(就想一个标杆来和其他的数比较),赋值给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.csdn.net/morewindows/article/details/6684558 欢迎小伙伴赐教