你有没有注意过自己的快排算法和别人不一样?
首先对于快排,基准数据使用第一个,中间,最后一个,或者随机一个,那么对排序过程有没有影响?
我以自己碰到一个题作为示例:
/*
*初始数据是25, 84, 21, 47, 15, 27, 68, 35, 20
*经过排序,每趟输出结果如下,让你用这种排序方法去提交
*/
15 20 21 25 47 27 68 35 84
15 20 21 25 47 27 68 35 84
15 20 21 25 47 27 68 35 84
15 20 21 25 35 27 47 68 84
15 20 21 25 27 35 47 68 84
15 20 21 25 27 35 47 68 84
第一眼看上去,这肯定是快排吧?但你动动手会发现第一趟结果可能就不一样??
那么怎么回事?
初步结论
我与朋友沟通了一下彼此的快排方法,发现真的过程不一样,他用的i,j指针同时找到时才交换,而我是每找到一个就交换,导致过程就不一样。
具体区别就是
别人的
附上我实现的代码,分别取第一个,最后一个和中间作为基准,看看结果
public static void kuaipai_mid(int[] a, int low, int high) {
if (low < high) {
int i = low, j = high;
int mid = low + high >> 1;
int tmp = a[mid];
a[mid] = a[low];
a[low] = tmp;
while(i <j) {
while (i<j && a[j] >= tmp) {
j--; }
while (i<j && a[i] <= tmp) {
i++; }
if(i < j) {
int flag = a[i];
a[i] = a[j];
a[j] = flag;
}
}
a[low] = a[i];
a[i] = tmp;
Print(a);
System.out.println();
kuaipai_mid(a, low, i-1);
kuaipai_mid(a, i+1, high);
}
}
public static void kuaipai_last(int[] a, int low, int high) {
if (low < high) {
int i = low, j = high;
int tmp = a[high];
while(i <j) {
while (i<j && a[i] <= tmp) {
i++; }
while (i<j && a[j] >= tmp) {
j--; }
// while (i<j && a[i] <= tmp) { i++; }
if