标签:
这张图片表示的是快速排序的非随机排法。可以看出,它是选择区域的最右值作为划分key。
1.两个while循环两头向中间走,走完后箭头两端:左边一头大于key值,右边一头小于key值。(要是等于怎么办?等于可以看作小于或者大于。这也就是快速排序不稳定的原因。)
2.替换箭头两处的值。
3.重复步骤1。直到左 >= 又。
4.此时已经完成了一次划分。(如果是第一次的话,key值在最后面没有变,数组已经被划分为了两部分,前面均小于key,后面均大于key。就像下图
当然,key的位置也要确定下来,只需要把它和大于key的第一个值互换就ok。如下图
)这样就是一次完美的划分了。
5,左边递归,右边递归,搞定。
代码便如下这般:
void swap(int *a, int *b){
int c = *a;
*a = *b;
*b = c;
}
void qsort(int a[], int low, int high){ int key = a[last]; int p1 = low; int p2 = high; while(p1 < p2){ while(p1 < p2 && a[p1] < key) ++p1; while(p1 < p2 && a[p2] > key) --p2; swap(&a[p1],&a[p2]); } swap(&a[p2],a[high]); qsort(a,low,p1-1); qsort(a,p1+1,high); }
百度百科上面的有点绕:
void Qsort(int a[], int low, int high) { if(low >= high) { return; } int first = low; int last = high; int key = a[first]; while(first < last) { while(first < last && a[last] >= key) --last; a[first] = a[last]; while(first < last && a[first] <= key) ++first; a[last] = a[first]; } a[first] = key; Qsort(a, low, first-1); Qsort(a, first+1, high); }
但是效果是一样的。
后面还会有一些随机法。
标签:
原文地址:http://www.cnblogs.com/wangchz13/p/4916885.html