快排和归并
快排
调试查看整个数组的值:*(&A[0])@count
简记:整个函数里没有等于号。
i < j的原因:会在一段索引里出不去从而死循环。
递归不是i而是j的例子:4 6 8 3 10 9 7 5 2 1。
看到的一个非常好的回答:

void Quick(int A[], int low, int high) {
if(low >= high) return;
int pivot = A[low + high >> 1];
int i = low - 1, j = high + 1;
while(i < j) {
while(A[++ i] < pivot);
while(A[-- j] > pivot);
if(i < j) {
swap(A[i], A[j]);
}
}
Quick(A, low, j);
Quick(A, j + 1, high);
}
归并
void merge(int A[], int l, int r) {
if(l >= r) return;
int mid = l + r >> 1;
merge(A, l, mid);
merge(A, mid + 1, r);
int k = 0, i = l, j = mid + 1;
while(i <= mid && j <= r) {
if(A[i] <= A[j]) {
temp[k ++] = A[i ++];
} else {
temp[k ++] = A[j ++];
}
}
while(i <= mid) temp[k ++] = A[i ++];
while(j <= r) temp[k ++] = A[j ++];
k = 0, i = l;
while(i <= r) {
A[i ++] = temp[k ++];
}
}
简记:与快排刚好相反。
被最后一个while坑了几回了。
浙公网安备 33010602011771号