数据结构 - 排序

参考资料:

D. E. 克奴特 <计算机程序设计技巧>

 

排序算法分为两大类:

* 内部排序

* 外部排序

 

内部排序有

* 插入排序

* 交换排序

* 选择排序

* 归并排序

* 计数排序

 

1. 插入排序

void InsertSort(int a[], int n)    
{    
    for(int i= 1; i<n; i++){    
        if(a[i] < a[i-1]){               //若第i个元素大于i-1元素,直接插入。小于的话,移动有序表后插入    
            int j= i-1;   //表中最后一个数据  
            int x = a[i];        //复制为哨兵,即存储待排序元素    
            a[i] = a[i-1];           //先后移一个元素 (因为a[i]就是X,所以不怕丢失)   
            while(j>=0 && x < a[j]){  //查找在有序表的插入位置  (遍历表)  
                a[j+1] = a[j];    
                j--;         //元素后移    
            }    
            a[j+1] = x;      //插入到正确位置    
        }    
    }       
}   

 

直接插入排序时间复杂度为O(n^2), 当n值很大时,不宜采用直接插入排序

 

2. 折半插入排序

void BInsertSort(int a[], int n)    
{    
    for(int i= 1; i<n; i++){    
        int low=0, high=i;  
        if(a[i] < a[i-1]){               //若第i个元素大于i-1元素,直接插入。小于的话,移动有序表后插入    
            int x = a[i];                //复制为哨兵,即存储待排序元素    
            a[i] = a[i-1];                //先后移一个元素 (因为a[i]就是X,所以不怕丢失)   
            while(low<=high){             //查找在有序表的插入位置  (遍历表)  
                int m=(low+high)/2;  
                if(x<a[m])  high=m-1;  
                else low=m+1;  
            }    
            for(int j=i-1;j>=high+1;j--)  
                a[j+1]=a[j];  
            a[j+1] = x;      //插入到正确位置    
        }    
    }    
        
}  

 

 

3. 

 

posted @ 2018-01-03 23:24  elewei  阅读(206)  评论(0)    收藏  举报