排序 -- 思路简析(二)

来源:互联网 发布:淘宝代发怎么发货 编辑:程序博客网 时间:2024/06/06 17:18

简介

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

直接插入排序(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;        }    }} 
1 0
原创粉丝点击