快排和归并

快排

调试查看整个数组的值:*(&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坑了几回了。

posted @ 2022-10-08 22:48  wushucan  阅读(7)  评论(0)    收藏  举报