C语言常见排序算法.ppt
《C语言常见排序算法.ppt》由会员分享,可在线阅读,更多相关《C语言常见排序算法.ppt(41页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、上章回顾上章回顾二叉树的定义树深度的定义什么样的二叉树是满二叉树中序遍历的规则常见排序算法常见排序算法常见排序算法常见排序算法第六章第六章第六章第六章预习检查预习检查课程目标课程目标本章概述本章概述几种常见排序算法。几种常见排序算法。本章目标本章目标熟悉常见的查找算法和排序算法熟悉常见的查找算法和排序算法难点难点快速排序算法快速排序算法 本章结构本章结构数据结构与算法初步数据结构与算法初步常见的排序算法6.1 常见的排序算法常见的排序算法 冒泡排序 快速排序直接插入排序 希尔排序 选择排序 堆排序归并排序 6.1.1 冒泡排序冒泡排序算法描述设待排序记录序列中的记录个数为n一般地,第i趟起泡排
2、序从1到n-i+1依次比较相邻两个记录的关键字,如果发生逆序,则交换之其结果是这n-i+1个记录中,关键字最大的记录被交换到第n-i+1的位置上,最多作n-1趟。6.1.1 冒泡排序冒泡排序算法实例2121252525*25*161608080 1 2 3 4 5212125*25*4949252516164949changchang=1=1080825*25*changchang=1=108081616changchang=1=125*25*252521214949212125251616080849496.1.1 冒泡排序冒泡排序算法实例25*25*0 1 2 3 4 5i=4=44949
3、1616changchang=1=108082525212125*25*i=5=549491616changchang=0=00808252521216.1.1 冒泡排序冒泡排序算法实例2 21 10 08 82 25 5 4 49 9 2 25 5 1 16 62 21 14 49 92 25 5 2 25 5 1 16 6 0 08 82 21 14 49 92 25 52 25 51 16 6 0 08 82 21 14 49 92 25 5 2 25 51 16 6 0 08 82 21 14 49 92 25 5 2 25 51 16 6 0 08 82 21 14 49 92 25
4、 5 2 25 51 16 60 08 8初始关键字第一趟排序第四趟排序第二趟排序第三趟排序第五趟排序6.1.1 冒泡排序冒泡排序算法实现输入n 个数给a1 到 anfor j=1 to n-1for i=1 to n-jaiai+1真假aiai+1输出a1 到 an#include main()int a11,i,j,t;printf(Input 10 numbers:n);for(i=1;i11;i+)scanf(%d,&ai);printf(n);for(j=1;j=9;j+)for(i=1;iai+1)t=ai;ai=ai+1;ai+1=t;printf(The sorted numb
5、ers:n);for(i=1;i11;i+)printf(%d,ai);6.1.2 快速排序快速排序 算法特点:快速排序是通过比较关键码、交换记录,以某个记录为界(该记录称为支点),将待排序列分成两部分一部分所有记录的关键码大于等于支点记录的关键码另一部分所有记录的关键码小于支点记录的关键码 6.1.2 快速排序快速排序 算法描述:任取待排序记录序列中的某个记录(例如取第一个记录)作为基准(枢),按照该记录的关键字大小,将整个记录序列划分为左右两个子序列左侧子序列中所有记录的关键字都小于或等于基准记录的关键字 右侧子序列中所有记录的关键字都大于基准记录的关键字基准记录则排在这两个子序列中间(这
6、也是该记录最终应安放的位置)。然后分别对这两个子序列重复施行上述方法,直到所有的记录都排在相应位置上为止。基准记录也称为枢轴(或支点)记录。取序列第一个记录为枢轴记录,其关键字为Pivotkey指针low指向序列第一个记录位置指针high指向序列最后一个记录位置6.1.2 快速排序快速排序 算法实例:212108082525494925*25*1616始关键字始关键字08082525494925*25*1616212108082525494925*25*161608082525494925*25*161608082525494925*25*161608082525494925*25*16162
7、121pivotkey一次交换一次交换二次交换二次交换三次交换三次交换high-1完成一趟排序完成一趟排序lowhighlowlowlowlowlowhighhighhighhighhigh6.1.2 快速排序快速排序 算法实例:152525494925*25*1616212108082525494925*25*161621210808完成一趟排序完成一趟排序分别进行快速排序分别进行快速排序有序序列有序序列08082525494925*25*161621216.1.2 快速排序快速排序 算法分析:快速排序是一个递归过程;利用序列第一个记录作为基准,将整个序列划分为左右两个子序列。只要是关键字小
8、于基准记录关键字的记录都移到序列左侧;快速排序的趟数取决于递归树的高度。如果每次划分对一个记录定位后,该记录的左侧子序列与右侧子序列的长度相同,则下一步将是对两个长度减半的子序列进行排序,这是最理想的情况 166.1.3 直接插入排序直接插入排序 算法描述:记录存放在数组R0.n-1中,排序过程的某一中间时刻,R被划分成两个子区间R0i-1和Ri.n-1,其中:前一个子区间是已排好序的有序区;后一个子区间则是当前未排序的部分。基本操作将当前无序区的第1个记录Ri插入到有序区R0.i-1中适当的位置,使R0i变为新的有序区 6.1.3 直接插入排序直接插入排序 操作细节:当插入第当插入第i(i1
9、)i(i1)个对象时个对象时,前面的前面的r0,r1,r0,r1,ri-1,ri-1已经排已经排好序。好序。用用riri 的关键字与的关键字与ri-1,ri-2,ri-1,ri-2,的关键字顺序进行比较的关键字顺序进行比较(和顺和顺序查找类似序查找类似),如果小于,则将,如果小于,则将rxrx 向后移动向后移动(插入位置后的记录向插入位置后的记录向后顺移后顺移)找到插入位置即将找到插入位置即将riri 插入插入6.1.3 直接插入排序直接插入排序 实用例子:已知待序的一组记录的初始排列为:已知待序的一组记录的初始排列为:21,25,49,2521,25,49,25*,16,08,16,0821
10、212525494925*25*161608080 1 2 3 4 56.1.3 直接插入排序直接插入排序 实用例子:0 1 2 3 4 5 temp212125494925*25*161608082525i=10 1 2 3 4 5 temp212125254925*25*161608084949i=221212525494925*161608080 1 2 3 4 5i=325*25*6.1.3 直接插入排序直接插入排序 实用例子:0 1 2 3 4 5 temp21212525494925*25*160808i=416160 1 2 3 4 5 temp21212525494925*25
11、*161608i=5080821212525494925*25*161608080 1 2 3 4 5完成6.1.3 直接插入排序直接插入排序 算法实现:void InsertSort(int r,int n)/假设关键字为整型,放在向量假设关键字为整型,放在向量r中中 int i,j,temp;for(i=1;i0;j-)/从后向前顺序比较,并依次后移从后向前顺序比较,并依次后移 if(temp rj-1)rj=rj-1;else break;rj=temp;6.1.3 直接插入排序直接插入排序 算法分析:关键字比较次数和记录移动次数与记录关键字的初始排列有关。最好情况下,排序前记录已按关键
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 常见 排序 算法
限制150内