排序

来源:互联网 发布:Python如何使用 编辑:程序博客网 时间:2024/06/05 08:12

排序的稳定性

排序的稳定性指的是带排序的记录序列中如果存在两个或两个以上的关键字相等的记录是,排序后能否保持原有的次序。

插入排序

插入排序的c语言实现

void InsertSort(SqList &L){    if(LT(L.r[i].key,L.r[i-1].key)){        L.r[0] = L.r[i];  //哨兵        L.r[i] = L.r[i-1];        for(j=i-2;LT(L.r[0].key,L.r[j].key);--j)            L.r[j+1] = L.r[0];    }}

设置哨兵的目的可以免去查找过程中每一步都要检测整个表是否查找完毕,可以提高性能,同时防止越界。
时间复杂度为O(n2)

折半插入排序

void BInsertSort(SqList &L){    for(i=2;i<=L.length;++i){        L.r[0] = L.r[i];        low = 1;        high = i-1;        while(low<=high){            m = (low+high)/2;            if(LT(L.r[0].key,L.r[m].key)) high = m-1;            else low = m+1;        }        for(j=i-1;j>=high+1;--j) L.r[j+1] = L.r[j];        L.r[high+1] = L.r[0];    }}

折半查找劲减少了关键字间的比较次数,而记录的移动次数不变,因此折半插入排序的时间复杂度仍未O(n2)。

冒泡排序

每一趟把一个最大的数移到最后,进行n趟排序后即可。

快速排序

快速排序是对冒泡排序的一种改进。它是先将一趟排序分割成独立的两部分,其中一部分比另一部分的关键字小,再分别对这两部分记录继续进行排序,就可以使整个序列有序。

void QSort(SqList &L,int low,int high){    if(low<high){        pivotloc = Partition(L,low,high);        QSort(L,low,pivotloc-1);        QSort(L,pivotloc+1,high);    }}void Partition(SqList &L,int low,int high){    L.r[0] = L.r[low];    pivotkey = L.r[low].key;    while(low<high){        while(low<high && L.r[high].key>=pivotkey) --high;        L.r[low] = L.r[high];        while(low<high && L.r[low].key<=pivotkey) ++low;        L.r[high] = L.r[low];    }    L.r[low] = L.r[0];    return low;}

若初始记录有序或基本有序的情况下,快排则变得和冒泡排序一样,快排选择枢轴记录就很重要,较为简单的一种选择方法是三数中值分割法,即在第一个数,中间的数和最后一个数中取中值作为枢轴。
快排的时间复杂度为O(nlogn),且是同数量级的排序方法中,平均性能最好的。

0 0
原创粉丝点击