内部排序 --交换排序:冒泡排序 快速排序

   》》 所谓交换,就是根据序列中两个元素关键字的比较结果来对换这两个记录在序列中的位置。

1、冒泡排序

     》》 冒泡排序算法的基本思想是:假设待排序表长为 n , 从后往前(或者从前往后)两两比较

       相邻元素的值,若为逆序(即 A[ i-1 ] > A[ i ]), 则交换它们,直到序列比较完。执行这样的一次

        操作称为“一趟冒泡”。

     》》 冒泡排序的代码示例:【从后往前】

        

// 用冒泡排序法将序列 A 中的元素从小到大排列
void BubbleSort(ElemType A[] , int n ){

    // i  表示的是序列 A 中的第一个元素的下标 
    // j  表示的是序列 A 中的最后一个元素的下标

    // i 变量刚开始是从序列 A 中的第一个元素的下标开始,当经过一趟冒泡
    // i 变量的起始下标将向后移动一位
    for( i=0 ; i < n-1 ; i++){
          
          // flag 变量,主要是用来标识本趟冒泡是否发生了冒泡
          boolean flag = false;

         // 下面的 for 循环,执行一次,就是一趟冒泡的过程
         //  j 变量一直从序列的最后一个元素的下标开始
         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 ; 
          }

    }
    
}

2、快速排序【对冒泡排序的改进】

    》》 快速排序是对冒泡排序的一种改进。其基本思想是基于分治法的:在待排序表 L[ 1...n ] 中任取出一个元素

    pivot 元素作为基准,通过一趟排序将待排序表划分为独立的两部分 L[1....K-1] 和 L[ K+1 ... n ],使得 L[1....K-1] 

    中所有元素小于 pivot , L[ K+1 ... n ] 中所有元素大于或等于 pivot  , 则将 pivot 放在了 L(K) 上,这个过程称作

    “一趟快速排序” 。 而后分别递归地对两个子表重复上述过程,直至每个部分内只有一个元素或空为止,即所有的

    元素放在了其最终位置上。

     》》 快速排序图解

         

       》》 补充:由于快速排序是递归的,需要借助一个递归工作栈来保存每一层递归调用的必要信息,其容量应与

            递归调用的最大深度一致。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小达人Fighting

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值