zoukankan      html  css  js  c++  java
  • 选择、插入、冒泡排序

    选择、插入、冒泡三种算是最典型的排序算法了,空间复杂度都为O(1)

    选择排序时间复杂度跟初始数据顺序无关,O(n2),而且还不稳定;

    插入排序时间复杂度跟初始数据顺序有关最好O(n),最坏O(n2),稳定

    冒泡排序时间复杂度跟初始数据顺序有关最好O(n),最坏O(n2),稳定

    三种算法中对于大量随机数,所需时间插入<选择<冒泡。

    // MySort.h: interface for the MySort class.
    #include "iostream.h"
    
    template<class T>
    void swap(T &a,T &b)
    {
        T c=a;
        a=b;
        b=c;
    }
    
    template<class T>
    void print(T a[], int n ,int i){  
        cout<<""<<i+1 <<"趟 : ";  
        for(int j= 0; j<10; j++){  
            cout<<a[j] <<"  ";  
        }  
        cout<<endl;  
    }  
    
    template<class T>
    void selectSort(T a[],int n)  //选择排序
    {
        int i,j,k;
        for(i=0;i<n-1;++i)
        {
            k=i;
            for(j=i+1;j<n;++j)
            {
                if(a[j]<a[k])
                    k=j;
            }
            if(k!=i)
                swap(a[i],a[k]);        
        }
    }
    
    template<class T>
    void selectSort2(T a[],int n)  //二元选择排序
    {
        int i,j,min,max;
        
        for (i=1;i <= n/2;++i)    // 做不超过n/2趟选择排序 
        {    
            min = i; max = i ; //分别记录最大和最小关键字记录位置  
            for (j= i; j<=n-i; ++j) 
            {  
                if (a[j] > a[max]) {   
                    max = j ; 
                    continue ;   
                }    
                if (a[j]< a[min]) 
                    min = j ;   
                
            }    
            //该交换操作还可分情况讨论以提高效率  
            swap(a[i-1],a[min]);
            if(max!=i)
                swap(a[n-i],a[max]);
            
    #ifdef _DEBUG
            print(a,n,i-1);
    #endif
            
        }   
    }
    
    template<class T>
    void insertSort(T a[],int n)  //插入排序
    {
        int i;
        for(i=1;i<n;++i)
        {
            if(a[i]<a[i-1])
            {
                int j= i-1; 
                T x = a[i];         //复制为哨兵,即存储待排序元素 
                a[i] = a[i-1];      //先后移一个元素
                while(j>=0 && x<a[j])     //查找在有序表的插入位置  
                {   
                    a[j+1] = a[j];  //元素后移 
                    j--;            
                }  
                a[j+1] = x;        //插入到正确位置  
            } 
        }
        
    }
    template<class T>
    void bubbleSort(T a[],int n)  //冒泡排序
    {
    /*
    int i,j;
    for(i=0; i<n-1; ++i) {  
    for(j=0; j<n-i-1; ++j) {  
    if(a[j] > a[j+1])  
    {  
    swap(a[j],a[j+1]); 
    }  
    }  
    #ifdef _DEBUG
    print(a,n,i);
    #endif
    } 
        */
        
        bool bSwaped = true;
        
        int i,j;
        int lastSwapPos, lastSwapPos_temp = 0; 
        for(i=0; i<n-1; ++i) 
        {  
            bSwaped = false;  
            lastSwapPos = lastSwapPos_temp; 
    
            for(j=n-1; j>lastSwapPos; j--) 
            {  
                if(a[j-1] > a[j])  
                {  
                    swap(a[j],a[j-1]); 
    
                    bSwaped = true;  
    
                    lastSwapPos_temp = j - 1;  
                }  
            }         
            // 如果上一次扫描没有发生交换,则说明数组已经全部有序,退出循环  
            if(!bSwaped)
                break;
        } 
        
    }
  • 相关阅读:
    解决浏览器兼容改内容的函数
    iPhone 和Android应用,特殊的链接:打电话,短信,email
    ArrayList和LinkedList的区别
    关于HashTable,HashMap和TreeMap的几点心得
    Android开发--List与ArrayList区别
    Android 版本升级涉及到的数据库数据迁移问题
    深入理解Android的startservice和bindservice
    Android之Activity的四种启动模式
    控制反转与依赖注入
    vi/vim基本使用方法
  • 原文地址:https://www.cnblogs.com/nkzhangkun/p/3990923.html
Copyright © 2011-2022 走看看