您的位置:首页 > 其它

排序 -- 思路简析(二)

2016-01-03 10:45 274 查看

简介

本篇文章总结一下最近学习的排序算法,提炼出其思想及不同之处。有直接插入排序,希尔排序,选择排序

直接插入排序(Insert Sort)

每次将无序区的第一个记录按关键字插入到有序区的合适位置,并将有序区长度加一

[code]
// 将a[0..len]进行插入排序,0号单元为哨兵 
void InsertSort(int a[],int len){

    // i标记有序区的最后一个位置 
    for(int i = 1; i < len; i ++){
        // 如果需要将a[i+1]插入有序序列
        if( a[i] > a[i+1] ){

            a[0] = a[i+1];
            int j = i+1;
            // 移动,记住<= >= 
            while(j>0 && a[j]>=a[0]){
                a[j] = a[j-1];
                j --;
            }

            a[j+1] = a[0];
        }
    }
}


最坏情况下时间复杂度O(n²)

希尔排序(Shell Sort)

希尔排序是将整个待排序列(R₁,R₂,R₃,… Rn)按增量d划分成d个子序列,其中第i(1<=i<=d)个子序列为(Ri,Ri+d,Ri+2d,…Ri+kd ),并分别对各个子序列进行直接插入排序;不断减小增量d,重复这一过程,直到d减少到1,对整个序列进行一次直接插入排序

[code]//对a[1..len]做一趟增量序列为 d 的希尔排序 
void ShellInsert(int a[],int len,int d){

    for( int i = 1; i + d <= len; i ++ ){
        if( a[i] > a[i+d] ){
            a[0] = a[i+d];

            int j = i+d;
            // 并且判断是否继续移动 ★★
            while(j-d>0 && a[j]>=a[0]){
                a[j] = a[j-d];
                j -= d;
            }

            a[j+d] = a[0];
        }
    }
}

void ShellSort(int a[],int len, int b[],int dlen){
    for( int i = 0; i < dlen; i ++ ){
        ShellInsert(a,len,b[i]);        
    }
}


希尔排序的时间复杂度是所取增量序列的函数,尚难准确分析。

希尔排序是不稳定排序

选择排序(Selection Sort)

从待排序的序列中选择最小或者最大的元素,并将其交换到已排序的尾部

[code]
// 对a[1..len]进行选择排序 
void SelectionSort(int a[],int len){

    int sel;
    for(int i = 1; i <= len; i ++ ){
        sel = i;
        for( int j = i; j <= len; j ++){
            if( a[sel] > a[j] )// 选出最小
                sel = j;
        }

        // 进行交换
        if( sel != i ){
            int t = a[sel];
            a[sel] = a[i];
            a[i] = t;
        }
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: