快速排序的注意事项
template<class Iter> void quick_sort(Iter begin, Iter end) { int sz = (int)distance(begin, end); if (sz < 2) return; //保存现场; Iter b = begin ; Iter e = end; int tmp = *begin; while (b < e) { while (*--e > tmp); while (b < e && *++b < tmp); if (b < e) iter_swap(b, e); } iter_swap(begin, e); quick_sort(begin, e); quick_sort(e + 1, end); } 第一,等于的时候进不进行交换。 需要进行交换,理由就是尽量使得被target被交换到数组的中央; 问题就出现了,如何保证等于的时候,不会发生死循环; 第二,从头遍历还是从后遍历。 从后遍历,因为第一点等于的时候也要进行交换,所以向后遍历最差情况也只是到第一个元素的时候停止,此时遍历的过程中是不需要加上while(i < j)的判断的; 第三,循环外与begin交换的是b,还是e。 这里是e,注意主要经过while (b < e)循环,e最后的位置一定保证是*begin最终的位置。 第四,可以将第三个while的b <