zoukankan      html  css  js  c++  java
  • #YBT整理 排序算法

    (CUC的妥协历程)

    算法描述

    选择排序

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

    冒泡排序

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

    归并排序

    拆分再组合。组合的时候遍历每一个数,两个子串组合成一个有顺序的串。复杂度(O(nlog 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;
    }
    
  • 相关阅读:
    Quartz.Net 作业调度后台管理系统,基于Extjs
    [备份]EntityFramework
    WebMisSharp升级说明,最新版本1.6.0
    AllPay(欧付宝)支付接口集成
    Paypal Rest Api自定义物流地址(跳过填写物流地址)
    根据IP获取国家
    ViewBag 找不到编译动态表达式所需的一种或多种类型,是否缺少引用?
    Extjs4 DateTimeField,日期时间控件完美版
    IOS Swift 训练
    .Net集成PayPal的Demo
  • 原文地址:https://www.cnblogs.com/Cao-Yucong/p/12184473.html
Copyright © 2011-2022 走看看