快速排序的思想是把一个序列分割成两个有序的序列,然后再结合起来,就完成了排序。
那么如何分割呢?如何保证结合起来之前两个序列都有序了呢?
最简单的方法就是要保证前面的序列的值全部小于或者大于后面的序列。
这里我们按递增排序。即左序列所有的值要全部小于右序列的值。
左序列大于右序列如何判断呢?
最简单的方法就是让这两个序列对一个数进行比较,如果左序列小于或等于这个数,而且右序列大于这个数,问题就解决了。
这个数从哪里来呢?当然是从我们的序列里面来。
现在问题简单了,序列变成了左序列+比较数(包含在左序列中)+右序列。
为了方便起见,左序列从序列左边开始,右序列从序列的右边开始,开始两个序列都是空的。
首先从序列中找一个数作为比较数,由于是无序的,通常选择第一个数作为比较数。
此时,很显然第一个数即使左序列的第一个元素,也是比较数,右序列的第一个数为序列的最右边的数。
左序列和右序列与比较数作比较,如果元素小于或等于比较数,加入到左序列;如果元素大于比较数加入到右序列。
void quicksort(int a[],int left,int right) { if (left>=right)return ; int j ,i,key; i=left;j=right;key=a[i]; while(i<j) { while(i<j&&a[j]>key)j--; if (i<j) a[i++]=a[j]; while (i<j&&a[i]<key)i++; if (i<j) a[j--]=a[i]; } a[i]=key; if (l<i-1) quicksort(a,left,i-1); if (i+1<h) quicksort(a,i+1,right); }