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;
    }
    
  • 相关阅读:
    jquery中 append 和appendto的区别
    vb的property 和event
    VB 基础语法以及教学视频
    outlook 2007 IMAP设置和配置
    浏览器文档播放Shockwave Flash 插件问题
    VB execl文件后台代码,基础语法
    VB中后台打开Excel文件实现代码
    excel文件后台代码
    DataTable中执行DataTable.Select("条件"),
    多个不同的表合并到一个datatable中,repeater在绑定datatable
  • 原文地址:https://www.cnblogs.com/Cao-Yucong/p/12184473.html
Copyright © 2011-2022 走看看