目录

  • 1 课程资料
    • 1.1 课程标准
    • 1.2 教学日历
    • 1.3 说课课件
  • 2 第一章绪论
    • 2.1 本章教学目标
    • 2.2 数据结构简介
    • 2.3 数据结构类型
    • 2.4 算法分析
    • 2.5 本章讲义
    • 2.6 本章测验题
    • 2.7 测验
  • 3 线性结构
    • 3.1 本章教学目标
    • 3.2 线性表
    • 3.3 线性表的顺序存储及运算实现
      • 3.3.1 本节讲义
    • 3.4 线性表的链式存储和 运算实现
      • 3.4.1 本节讲义
    • 3.5 应用
    • 3.6 数组
      • 3.6.1 讲义
    • 3.7 本章测验题
    • 3.8 测验
    • 3.9 作业
  • 4 第三章栈和队列
    • 4.1 本章教学目标
    • 4.2 第一课时栈
      • 4.2.1 讲义
    • 4.3 第二课时队列
      • 4.3.1 讲义
    • 4.4 应用
      • 4.4.1 讲义
    • 4.5 本章测验题
  • 5 第四章串
    • 5.1 第一课时概念
    • 5.2 本章学习目标
    • 5.3 本章测验题
  • 6 第五章树和二叉树
    • 6.1 本章学习目标
    • 6.2 第一课时树的定义及基本术语
    • 6.3 第二课时二叉树定义性质存储
    • 6.4 第三课时二叉树遍历
    • 6.5 第四二叉排序与平衡二叉树
    • 6.6 第五树森林二叉树之间转换
    • 6.7 第六课时哈夫曼树
    • 6.8 本章测验题
    • 6.9 测验
    • 6.10 作业
  • 7 第六章图
    • 7.1 本章学习目标
    • 7.2 第一课时图的基本概念
    • 7.3 第二课时图的存储
    • 7.4 第三课时图的遍历
    • 7.5 第四课时最小生成树
    • 7.6 第五课时最短路径
    • 7.7 第六课时拓扑排序
    • 7.8 第七课时关键路程
    • 7.9 本章测验题
    • 7.10 测验
    • 7.11 作业
  • 8 第七章查找
    • 8.1 本章学习目标
    • 8.2 第一课时顺序查找二分查找
    • 8.3 第二课时哈希表
    • 8.4 本章测验题
    • 8.5 测验
    • 8.6 作业
  • 9 第八章排序
    • 9.1 本章学习目标
    • 9.2 第一课时基本概念
    • 9.3 第二课时插入选择排序
    • 9.4 第三课时交换排序
    • 9.5 第四课时归并 基排序及比较
    • 9.6 本章测验题
    • 9.7 测验
    • 9.8 作业
第三课时交换排序

快速排序(Quick  Sort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将待排序记录划分成两部分,使得其中一部分记录的关键字比另一部分记录的关键字小;

然后再分别对这两部分记录进行这种排序,直到每个部分为空或只包含一个记录时,整个快速排序结束。

假设待排序的序列为(r[s],r[s-1],…,r[t])。首先任意选取一个记录(通常可选第一个记录r[s]作为基准记录或称为支点),然后重新排列这些记录。将所有关键字较它小的记录都排到它的位置之前,将所有关键字较它大的记录都排到它的位置之后。由此可以将该基准记录所在的位置i作为分界线,将待排序记录序列划分成两个子序列(r[s],…,r[i-1])和(r[i+1],…,r[t])。这个过程称为一趟快速排序。

一趟快速排序完成后得到前后两个子序列,可再分别对分割后的两个子序列进行快速排序。整个快速排序过程结束。

例如,待排序记录的关键字为:

    42 36 56 78 67 11 27 36

int Partition(int r[],int s,int t)

{

   int i,j,rp;

   i=s;j=t;

   rp=r[s];                         /*基准记录暂存入rp*/

   while(i<j)                       /*从序列的两端交替向中间扫描*/

   {

      while(i<j&&r[j]>=rp) 

         j--;                       /*扫描比基准记录小的位置*/

      r[i]=r[j];                    /*将比基准记录小的记录移到低端*/

      while(i<j&&r[i]<=rp)

         i++;                       /*扫描比基准记录大的位置*/

      r[j]=r[i];                    /*将比基准记录大的记录移到高端*/

   }

   r[i]=rp;                         /*基准记录到位*/

   return i;                        /*返回基准记录位置*/

}

void Qsort(int r[],int s,int t)     /*快速排序递归算法*/

{

   int k;

   if(s<t)                          /*长度大于1*/

   {

      k=Partition(r,s,t);           /*调用一趟快速排序算法将r[s]..r[t]一分为二*/

      Qsort(r,s,k-1);               /*对低端子序列递归排序,k是支点位置*/

      Qsort(r,k+1,t);               /*对高端子序列递归排序*/

   }

}

快速排序的时间复杂度平均为 O(nlog2n),当n较大时, 这种算法是平均速度最快的排序算法,因此称为快速排序。快速排序是一种不稳定的排序方法。