排序之交换排序(冒泡排序,快速排序)

1. 冒泡排序

a. 基本思想

     假设待排序比表长为n, 从后向前(或从前往后)两两比较相邻元素的值,若未逆序则交换,直到序列比较完,则称一趟冒泡。最小值如同气泡逐渐向上“漂浮”,直至“水面”。下一趟最小元素已到第一序列,不用比较。待排序列减少一个元素,每趟冒泡都将序列中的最小元素放到序列的最终位置

b. 代码
void BubbleSort(ElemType A[], int n){
    //用冒泡法将序列A中的元素按从小到大排列
    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 = ture;
            }
        if(flag == false)
            return ;              //本次遍历后没有发生交换,说明表有序。   
    }
}

     这时flag标志的使用,在最优情况下,O(1)即可排序完

c. 性能评估

     空间效率O(1)。时间效率O(n^2)。稳定性:由A[j-1].key>A[j].key可以看出,即使相同也不会交换,从而冒泡排序是稳定的排序方法。
 

2. 快速排序

a. 基本思想

     快速排序是对冒泡排序的一种改进。基本思想就是分冶法,在待排序表L[1…….n]中任取一个元素pivot作为基准(一般选第一位元素),通过一趟排序将待排序表划分成独立的2个部分L[1…..k-1]和L[k+1…..n]。使得L[1…..k-1]中的所有元素小于pivot,L[k+1……n]都大于或等于pivot。则pivot最终放在位置L[k]上,这称为一趟快速排序。而后分别递归地对两个子表重复上述过程,直至每部分内只有一个元素或空为止,即所有元素放在其最终位置上。

b. 代码
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;                           //返回存放枢轴的最终位置
}

手写过程(只写一趟比较)

pviot比较数组
nullnull6(low) 7 10 2 4(high)
64<64 7(low) 9 10 2 4(high)
67>64 7(low) 9 10 2 7(high)
62<64 2(low) 9 10 2(high) 7
69>64 2 9(low) 10 9(high) 7
610>64 2 9(low high) 10 9 7
6low=high4 2 6 10 9 7
c. 性能分析

     空间效率:由于快排是递归的,需要借助一个递归工作栈来保存每一层递归调用的必要信息。O(n)。最坏时间复杂度O(n^2)。
     不稳定的排序方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值