排序

https://www.luogu.com.cn/problem/P1177

桶排序

归并排序

分治

void paixu(int l,int r){
	if(l >= r) return;
	int mid = (l + r) >> 1;
	paixu(l,mid); paixu(mid+1,r);
	int i = l, j = mid + 1, cnt = l-1;
	while(i <= mid && j <= r){
		if(a[i] <= a[j]) {b[++cnt] = a[i]; ++i;}
		else {b[++cnt] = a[j]; ++j;}
	}
	while(i <= mid) {b[++cnt] = a[i]; ++i;}
	while(j <= r) {b[++cnt] = a[j]; ++j;}
	for(i = l; i <= r; ++i) a[i] = b[i];
}

求逆序对

void paixu(int l,int r){
	if(l >= r) return;
	int mid = (l + r) >> 1;
	paixu(l,mid); paixu(mid+1,r);
	int i = l, j = mid + 1, k = l;
	while(i <= mid && j <= r){
		if(a[i] <= a[j]) {b[k] = a[i]; i++; k++;}
		else {
			b[k] = a[j]; j++; k++;
			ans += mid - i + 1;
		}
	}
	while(i <= mid) {b[k] = a[i]; i++; k++;}
	while(j <= r) {b[k] = a[j]; j++; k++;}
	for(int i = l; i <= r; ++i) a[i] = b[i];
}

快速排序

void paixu(int l,int r){
	if(l >= r) return;
	int i = l, j = r, mid = a[(l + r) >> 1];
	while(i <= j){//要加等号,不然不能运行🤔(不太明白)
		while(a[i] < mid) i++;
		while(a[j] > mid) j--;
		if(i <= j){
			swap(a[i],a[j]);
			i++; j--;
		}
	}
	paixu(l,j); paixu(i,r);
}
posted @ 2024-10-29 12:11  弗阴  阅读(26)  评论(0)    收藏  举报