在大话数据结构这本书中,对快速排序进行改进的QSort1代码如下:
void QSort1(SqList *L,int low,int high) { int pivot; if((high-low)>MAX_LENGTH_INSERT_SORT) { while(low<high) { pivot=Partition1(L,low,high); /* 将L->r[low..high]一分为二,算出枢轴值pivot */ QSort1(L,low,pivot-1); /* 对低子表递归排序 */ /* QSort(L,pivot+1,high); /* 对高子表递归排序 */ low=pivot+1; /* 尾递归 */ } } else InsertSort(L); }可以看到作者的最初思想是当数组长度小于某个长度时,就去调用直接插入排序,这个想法是非常正确的,但是作者忽略了一个情况QSort1函数是一个递归调用的函数,举个例子,一个数组长度是9的数组,在某次递归用后执行QSort(L,1,5),这样进入函数内部就会调用InsertSort(L), 注意这个InsertSort传入的参数是整个数组L,也就意味着,再递归调用的过程中会多次对整个数组进行直接插入排序,这显然是不正确的!
实际上实现作者的思想,就不要把这个判断放在递归调用的函数中,可以放在QuickSort1这个函数中,
/* 对顺序表L作快速排序 */ void QuickSort1(SqList *L) { if(L->length > MAX_LENGTH_INSERT_SORT) { printf("quicksort\n"); QSort1(L,1,L->length); } else { printf("InsertSort\n"); InsertSort(L); } }这样就解决了,反复调用InsertSort的问题。 觉得说的有意义的老铁们给个赞吧!