上面这段代码摘自百度百科-快速排序。 初始值: 57 68 59 52 72 28 96 33 24 调用结果分析: Key = 57 24 68 59 52 72 28 96 33 68 first,last(1,8) —1
24 33 59 52 72 28 96 59 68 first,last(2,7) —2
24 33 28 52 72 72 96 59 68 first,last(4,5) —3
24 33 28 52 72 72 96 59 68 first,last(4,4) —3 枢轴记录到位后,本次调用Qsort结果: :24 33 28 52 57 72 96 59 68
经过本次循环,Key左边的值都小于Key,Key右边的值都大于Key 下面分别再对57左右两边的数据调用QSort,递归;
上面的QSort是最终while (first < last)一次循环结束后才对最后这个a[first]赋值为key :a[first] = key;/枢轴记录到位/ //这句是把最终first所指的72换成初始时给的key值:57。
试着写了下快速排序,如下,与上面的区别主要在:一次QSort调用中每次进行交换操作时,交换操作是否交换的彻底。 写成下面这样,每次交换操作时,都彻底交换值:
void Qsort(int a[], int low, int high) { if (low >= high) { return; } int first = low; int last = high; int numKey = first; int key = a[numKey]; while(first < last) { while (a[last] >= key&&first < last)// 从后往前遍历,找到一个小于key的 { last--; } a[numKey] = a[last]; a[last] = key; numKey = last; //last与numKey所指的值交换后,numKey换成指last值。 while (a[first] <= key&&first < last) //从前往后找,找一个大于key的 { first++; } a[numKey] = a[first]; a[first] = key; numKey = first; //first与numKey所指的值交换后, numKey换成指first值。 } Qsort(a,low,numKey-1); Qsort(a,numKey+1,high); }numKey用来记录当前key所在的位置。
–欢迎指正和补充!–