交换排序(冒泡+快速)

冒泡排序

基本思想:从后往前比较相邻元素,把当前序列中最小的元素交换至最前面,去掉这个元素在剩下的序列中重复这个过程。

void BubbleSort(ElemType A[], int n)
{
    for(i=0;i<n-1;i++){
        flag=false;
        for(j=n-1;j>i;j--)
            if(A[j-1].key>A[j].key){
                swap(A[j-1], A[j]);
                flag=true;
            }
        if(flag==false)
            return;  //本趟遍历后没有发生交换,说明表已经有序
    }
}

空间效率 O(1)
时间效率 O(n^2)
稳定


快速排序

基本思想:在待排序表L[1...n]中任取一个元素pivot作为基准,通过一趟排序,将排序表分为独立的两部分,小于pivot的L[1...k-1]和大于pivot的L[k+1...n]而pivot放在其最终的位置L[k],这称为一趟快速排序。然后分别递归对两个子表重复上述过程,直到每部分只有一个元素或为空为止。

void QuickSort(ElemType A[], int low, int high){
    if(low<high){
        int pivotpos=Partition(A, low, high);
        QuickSort(A, low, pivotpos-1);
        QuickSort(A, pivotpos+1, high);
    }
}

"快速排序算法的关键在于划分操作"
"这里采用每次都以当前表中第一个元素作为基准来对表进行划分的方法"

int Partition(ElemType A[], int low, int high)
{
    ElemType pivot=A[low];
    while(low<high){
        while(low<high&&A[high]>=pivot)  --high;
        A[low]=A[high]
        while(low<high&&A[low]<=pivot)   ++low;
        A[high]=A[low];
    }
    A[low]=pivot;
    return low;
}

空间效率 最坏O(n) 平均O(log2n)
时间效率
与划分是否对称有关
最坏情况:每次划分的两个区域都是n-1和0个元素(初始排序表基本有序或基本逆序) O(n^2)
最好情况:每次划分两个区域的大小都不大于n/2 O(nlog2n)
平均情况下的运行时间与其最佳情况接近
快速排序是所有内部排序算法中平均性能最好的
提高效率的方法:当递归过程中划分得到的子序列的规模较小时就不要再继续递归调用,而是直接采用直接插入排序;尽可能选取可将数据中分的pivot,比如从序列的头尾及中间选取三个元素,再取它们的中间值作为pivot,或随机从当前表中选取。
不稳定
若右端区间有两个关键字相同,且小于pivot,则在交换到左区间后,相对位置会发生变化。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,214评论 0 52
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 1,270评论 0 2
  • 概述 因为健忘,加上对各种排序算法理解不深刻,过段时间面对排序就蒙了。所以决定对我们常见的这几种排序算法进行统一总...
    清风之心阅读 717评论 0 1
  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 5,900评论 0 13
  • 交换排序的基本思想:两两比较排序记录关键字,一旦发现两个记录不满足次序要求时进行交换,直到整个序列全部满足要求为止...
    yinxmm阅读 896评论 0 0