#YBT整理 排序算法

(CUC的妥协历程)

算法描述

选择排序

每次遍历数列的时候,挑出最大(最小)的数放在最前面,复杂度\(O(n^2)\)

冒泡排序

每次遍历到a[i]的时候,将a[i]和a[i + 1] 作比较,并把更大的(更小的)放在a[i+1],然后再看a[i+1]。复杂度\(O(n^2)\)

归并排序

拆分再组合。组合的时候遍历每一个数,两个子串组合成一个有顺序的串。复杂度\(O(n\log n)\)

快速排序

相对来讲是最难的,每次写都GG

选择区间内的一个数作为参考把比它大(小)的扔到右边,把比它小(大)的扔到左边。

代码实现

哦对我排序都是按照从大到小排的。神知道我这么闲的上

选择排序

注意点啥呢。。没啥注意的。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
int a[100000];
int main(){
	cin >> n;
	for(int i = 1;i <= n; i++) cin >> a[i];
	int tag = 0;
	for(int i = 1;i <= n; i++){
		tag = i;
		for(int j = i+1;j <= n;j++){
			if(a[j] > a[tag])
				tag = j;
		}
		swap(a[i],a[tag]);
	}
	for(int i = n;i >= 1; i--){
		cout << a[i] << ' ';
	}
	return 0;
}//lcez_cyc

冒泡排序

这个也没啥。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
int a[100000];
void mpsort(){
	for(int i = 1;i <= n; i++){
		for(int j = 1;j <= n-i; j++){
			if(a[j+1] < a[j]){
				swap(a[j+1],a[j]);
			}
		}
	}
}
int main(){
	cin >> n;
	for(int i = 1;i <= n; i++) cin >> a[i];
	mpsort();
	for(int i = 1;i <= n; i++) cout << a[i] << ' ';
	return 0;
}

归并排序

代码实现:递归,先用d数组存储,最后再拷到a当中。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,a[100000];
int d[100000];
void msort(int l,int r){
	if(l == r) return ;
	int mid = (l + r) >> 1;
	msort(l,mid);
	msort(mid+1,r);
	int i = l,j = mid+1;
	int tot = l;
	while(i <= mid && j <= r){
		if(a[i] < a[j]){
			d[tot++] = a[j++];
		}else{
			d[tot++] = a[i++];
		}
	}
	while(i <= mid) d[tot++] = a[i++];
	while(j <= r) d[tot++] = a[j++];
	for(int i = l;i <= r; i++){
		a[i] = d[i];
	}
}
int main(){
	cin >> n;
	for(int i = 1;i <= n; i++){
		cin >> a[i];
	}
	msort(1,n);
	for(int i = n;i >= 1; i--) 
		cout << a[i] << ' ';
	return 0;
}

快速排序

需要注意的就那个选取的是参考值,调整完了他会变化位置,所以就不能以中间点来递归了

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
int a[100000];
void qsort(int l,int r){
	if(l >= r) return;
	int i = l,j = r;
	int mid = (l + r) >> 1;
	mid = a[mid];
	do{
		while(a[i] > mid) i++;
		while(a[j] < mid) j--;
		if(i <= j)
			swap(a[i++],a[j--]);
	}while(i <= j);
	//注意:虽然选取了中间值,但是不能确定选择之后中间值的位置 
	if(l < j) qsort(l,j);
	if(i < r) qsort(i,r);
}//8 6 4 2 4 5 1 3 7
int main(){
	cin >> n;
	for(int i = 1;i <= n; i++) cin >> a[i];
	qsort(1,n);
	for(int i = n;i >= 1; i--) cout << a[i] << ' ';
	return 0;
}
posted @ 2020-01-12 19:50  CYC的幸福生活  阅读(229)  评论(0编辑  收藏  举报