快速排序是数据结构非常经典的一个排序算法,它是在1962年hoare开发的,快速排序用的也是分治的思想。下面来分析一个具体的例子吧。
有这样一个序列,我们用分治法的思想就是要找到一个基准值,进行第一次快速排序之后,这个基准值的左边都比它小,这个基准值的右边都比他的值要大,很显然这个基准值已经将这个序列分成了两个部分,然后递归再在两边分别进行同样的步骤,这个就是快速排序的思想。
a[7]={4,2,6,3,1,7,5};
4 | 2 | 6 | 3 | 1 | 7 | 5 |
如何进行呢?一般都是以第一个元素为基准值,设置两个值i,j,i=0,j=n-1然后j从这个序列的最后面找到一个比基准值小的数,然后让这个数和基准值交换,即a[i]和a[j]交换知道i=j时,也就是基准值的左右两边已经相等了,下面来实际的走一下吧。
第一次:
初始化:i=0,j=6,key=4;//key代表基准值
① 从后边找一个比key小的数交换
i=0,j=4,key=4;即找到了a[4],a[0]和a[4]交换;
1 | 2 | 6 | 3 | 4 | 7 | 5 |
②然后再从前面开始找一个比key大的数
i=2,j=4,key=4;a[2]和a[4]交换
1 | 2 | 4 | 3 | 6 | 7 | 5 |
③从后找一个比key小的数
i=2,j=3,key=4;a[2]和a[3]交换
1 | 2 | 3 | 4 | 6 | 7 | 5 |
④然后再从前面找一个比key大的值,
i=3;j=3,key;
因为i已经等于j了,所以第一次快速排序已经结束了,再看看我们的key=4,4的左边都是比它小的,4的右边都是比它大的。
第二次会被key分成两部分,左边和右边在进行第一次的步骤,一直递归下去,直到整个序列有序。
下面把参考代码贴在下面
#include<iostream> using namespace std; void qsort(int a[],int low,int high) { if(low>=high) return ; int i=low; int j=high; int key=a[low]; int temp; while(i<j){ while(i<j&&key<=a[j]){ j--; } temp=a[i]; a[i]=a[j]; a[j]=temp; while(i<j&&key>=a[i]){ i++; } temp=a[i]; a[i]=a[j]; a[j]=temp; } qsort(a,low,i-1); qsort(a,i+1,high); } int main() { int n; cin >> n; int a[n]; for(int i=0;i<n;i++){ cin >> a[i]; } qsort(a,0,n-1); for(int i=0;i<n;i++){ cout << a[i] << ' '; } return 0; }