zoukankan      html  css  js  c++  java
  • 排序

    算法的稳定性

    稳定性是值当排序前,A在B前,如果排序后A还在B前,则算法稳定

    冒泡排序

    思想:从无序序列的起始位置,和下一位置的值进行俩俩比较

    如果前一个对应的值比后一个值小,不动。如果前一个值比后一个值大,则交换位置

    这样每一次都能筛选出,除了已经筛选序列中最大的,放到筛选好的队伍中

    算法复杂度:每次对n元素递减 T(n) = O( n^2)

    img

    int main(){
    	for(int i=0;i<9-1;i++)
    		for(int j=0;j<9-1-i;j++)
    			if(arr[j]>arr[j+1])
    			{
    				int tmp = arr[j];
    				arr[j]=arr[j+1];
    				arr[j+1]=tmp;
    			}
        return 0;
    } 
    

    选择排序

    选择排序就是在序列A中首选寻找出最大的元素(或者最小的元素)放在一个位置上,从而找到一个序列的最大的数,剩下的元素以此类推,找到第二大的元素,第三大的元素

    算法复杂度:每次对n元素递减 T(n) = O( n^2)

    img

    void swap(int n, int m){
    	int tmp = lst[n];
    	lst[n]=lst[m];
    	lst[m]=tmp;
    }
    void sort(int len){
    	for(int i=0;i<len;i++){
    		int n =i;
    		for(int j=i+1;j<len;j++){
    			if(lst[n]>lst[j])
    				n=j;
    		}
    		if(n !=i) // 判断当前i的位置是不是最大的,是就不用交换了
    			swap(i,n);
    	} 
    }
    

    插入排序

    img

    插入排序个人理解更加像体育课排身高,需要以次的去比较高低大小,第一个人,他本身就第一位置前面没有人,所以第一位不需要比较。第二个人,我不能往后去站啊,因为后面有比我高的有低比我的,只能往前面的人去比较,第一个人如果比我低,我就可以不动了,如果比我高点,好咱俩交换位置。第三个人就要和前俩个人去进行比较,当我比第二个人高了,那就不用个第一个人比较了

    算法复杂度:每次对n元素递减 T(n) = O( n^2)

    // 递归版本
    void sort(int len){
        	if(len == 0)return;
        	sort(len-1);
         
        	int tmp = arr[len];
        	while(len>0 && tmp < arr[len-1]){
        		arr[len]=arr[len-1];
        		len--;
        	}
        arr[len]=tmp;
    }
    
    // 非递归版本,for + while
    int main(){
    	for(int i=1;i<9;i++){
    		int tmp=arr[i];
    		int n = i;
    		while(n>0 && tmp<arr[n-1]){
    			arr[n]=arr[n-1];
    			n--; }
    		arr[n]=tmp;
    	}
    	return 0;
    } 
    

    希尔排序

    了解了插入排序后,插入排序比较的进位是单位1,而希尔排序就是在插入的基础进位为 序列长度的一半,每次递归进位是上层进位的一半 ,有 8个元素的序列进位是 4 2 1

    算法复杂度:T(n) = n*logn 或者 O( n^2)

    img

    void sort(int mode,int right){
        	if(mode == 0)return;
    		for(int i=mode;i<right;i++){
    			int tmp=lst[i];
    			int n = i;
    			while(n>0 && tmp<lst[n-mode]){
    				lst[n]=lst[n-mode];
    				n-=mode;
    			}
    			lst[n]=tmp;
    		}
    	sort(mode/2,right);
    }
    int main(){
    	sort(9/2,9);
    	return 0;
    }  
    

    全排列

    比如 123 有六种方式:123 132 213 231 312 321 这就是全排列

    void swap(int n, int m){
    	int tmp=arr[n];
    	arr[n] = arr[m] ;
    	arr[m] = tmp;
    }
    void p(int position, int len){
    	if(position == len){//当positon等于了len就是排到最后一个数了,之下来已经没有数再去排了
    		for(int i=0;i<len;i++)
    			cout<<arr[i]<<" ";
    		cout<<endl;
          }
    	else{
    		for(int i=position;i<len;i++)
    		{
    			swap(i,position);
       // 交换元素,达到循环渐进的效果,比如 123  213
    			p(position+1,len);
    			swap(position,i);
       // 交换完毕后,要把元素归位 让下个元素和它下个元素交换
    		}
    	}	
    } 
    

    使用c++的库函数 algorithm vector

    #include<iostream>
    #include<vector>
    #include<algorithm>
    using namespace std;
    
    int arr[]={1,2,3,4};
    
    int main(){
        	vector<int> lst; // 创建 int 类型的集合 vector
    	for(int i=0;i<4;i++)
    		lst.push_back(arr[i]);  // 把序列中元素加入vector集合 叫做压缩
    	do{
    		for(int i=0;i<4;i++)
    			cout<<lst[i]<<" ";
    		cout<<endl;
    	}while(next_permutation(lst.begin(),lst.end()));
     // next_permutation 是全排序函数 存在于算法包中 algorithm 
     // 用法是 do----while
     // 参数是 对于集合或者字符串string 类型 起始位置 begin 终至位置 end
    	return 0;
    }
    
  • 相关阅读:
    SQL游标操作每隔5分钟时间段数据统计信息
    win64位操作系统下安装pl/sql developer 并登录连接到oracle12c
    分科目统计每科前三名的学生
    merge源表数据移植到目标表新表数据中
    sqlserver表分区
    用SqlBulkCopy批量插入数据到SqlServer数据库表中
    SQL server插入数据后,如何获取自增长字段的值?
    Java创建线程的三种方式
    Java用户线程和守护线程
    Java虚拟机详解
  • 原文地址:https://www.cnblogs.com/xuanxuan360/p/12599032.html
Copyright © 2011-2022 走看看