快速排序-pt课件.pptVIP

  • 5
  • 0
  • 约2.65千字
  • 约 23页
  • 2018-11-09 发布于浙江
  • 举报
快速排序-pt课件

快速排序导入 快速排序导入 – 冒泡排序过程 快速排序导入 – 冒泡排序过程 快速排序导入 – 冒泡排序过程 快速排序导入 快速排序导入 – 冒泡排序分析 对所有记录从左到右每相邻的元素进行比较 ,不符合要求则交换 快速排序导入 – 冒泡排序分析 快速排序导入 – 冒泡排序分析 快速排序思想 快速排序思想 快速排序讲解 快速排序讲解 快速排序讲解 快速排序讲解 快速排序讲解 快速排序讲解 快速排序讲解 快速排序完整代码 快速排序完整代码 算法分析 练习题 快速排序 作者:杨劲松 内容提要 快速排序导入 快速排序思想 快速排序讲解 快速排序算法分析 练习题 退出 请同学们使用冒泡排序的方法将下列数据排序:(从小到大) 21 25 49 16 25 06 目录 初始状态 第一次交换结束 目录 第二次交换 第二次交换结束 目录 第三次交换结束 第二次交换结束 第四次交换结束 目录 第六次交换结束 第五次交换结束 请同学们说说 冒泡排序是如何工作的 目录 冒泡排序的基本做法: 思考:在数据为以下排列时,冒泡的排序效果好不好? 49 25 25 21 16 06 初始状态是反序的,则需要进行n-1趟扫描 目录 从直观上49移动到最终的位置经过了n-1次比较和交换 49 25 25 21 16 06 06 16 21 25 25 49 能不能不经过n-1次比较和交换呢? 不能?这是由于冒泡排序中需要相邻的元素两两比较、交换 目录 基本思想: 1)寻找一个中心元素(通常为第一个数) 2)将小于中心点的元素移动至中心点之前,大于中心点的元素移动至中心点之后。 3)对上步分成的两个无序数组段重复1)、2)操作直到段长为1。 t t =t 目录 以21为中心元素 划分可得: 以06、49为中心元素 划分可得: 目录 选取中心元素的问题 选取第一个数为中心元素 如何划分问题 如何重复步骤①②将所有数据排序 使用递归 目录 当已知中心元素的前提下,怎样将其他元素划分好?(即:大于中心点在之后,小于中心点在之前) 需要解决的问题 i [0] [1] [2] [3] [4] [5] i=0 i=1 j=5 j=5 j i=1 j=3 i=1 j=4 i=2 j=3 i=2 j=2 算法终止 目录 请同学们思考 该算法有没有可以改进的地方 目录 i [0] [1] [2] [3] [4] [5] i=0 i=1 j=5 j=5 j i=1 j=3 i=1 j=4 i=2 j=3 i=2 j=2 算法终止 通过动画,可以看出每次中心元素都要交换。根据划分的思想最后位置一定是中心元素 可以申请一个变量保存中心元素,以避免交换 目录 i=left;j=right;int temp=a[left]; do { //从右向左找第1个不小于中心元素的位置j while( a[j] temp ij) j--; if(ij) { a[ I ] = a[ j ]; i++; } a[i]=temp; left,right用于限定要排序数列的范围,temp即为中心元素 程序填空 当前元素小于中心元素结束循环时,应当在中心元素的左边 移至左边 目录 //从左向右找第1个不大于中心元素的位置i while(a[i]temp ij ) i++; if(ij) { a[j]=a[i]; j--; } }while(ij); a[i]=temp; //将中心元素t填入最终位置 程序填空 目录 函数头:quicksort(int a[],int left,int right) 初始化:i=left;j=right;int temp=a[left]; 划分:do{一次划分} while(ij); 中心元素填入:a[i]=temp; 递归地对剩余段作快速排序 quicksort(a,left,i-1); quicksort(a,i+1,right); 目录 void quicksort(int a[],int left,int right) { int i,j; if(leftright) { i=left;j=right; int temp=a[left]; do { while(a[j]temp ij) j--; if(ij) { a[i]=a[j]; i++; } 目录 while(a[i]temp ij) i++; if(ij) { a[j]=a[i]; j--; } }while(ij); a[i]=temp; quicksor

文档评论(0)

1亿VIP精品文档

相关文档