排序 -- 思路简析

Posted Y_ZhiWen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序 -- 思路简析相关的知识,希望对你有一定的参考价值。

简介

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

直接插入排序(Insert Sort)

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


// 将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,对整个序列进行一次直接插入排序

//对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)

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


// 对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;
        
    
 

以上是关于排序 -- 思路简析的主要内容,如果未能解决你的问题,请参考以下文章

排序 -- 思路简析

简析拓扑排序

Linux 系统故障排查思路简析

ANR分析思路简析

简析学习总结思路

排序希尔排序