从起泡排序探究算法正确性证明的一般规律

起泡排序

问题:该算法必然会结束?至少需要迭代多少趟?

不变性:经k 轮扫描交换后,最大的k 个元素必然就位

单调性:经k 轮扫描交换后,问题规模缩减至n-k

正确性:经至多n 趟扫描后,算法必然终止,且能给出正确解答

时间: 2024-10-13 14:35:01

从起泡排序探究算法正确性证明的一般规律的相关文章

改进的起泡排序算法--java

一.基本思路: 冒泡排序是一种简单的交换类排序.其基本思路是从头开始扫描待排序的元素,在扫描过程中依次对相邻元素进行比较,将关键字值大的元素后移.每经过一趟排序后,关键字值最大的元素将移到末尾,此时记下该元素的位置,下一趟排序只需要比较到此位置为止,直到所有元素都已有序排列. 一般地,对n个元素进行冒泡排序,总共需要进行n-1趟.第1趟需要比较n-1次,第2趟需要比较n-2次,......第i趟需要比较n-i次. 二.算法 2.1原始起泡排序算法 public static int[] bubb

排序 起泡排序(bubble sort),归并排序(merge sort)

1,起泡排序(bubble sort),大致有三种算法 基本版,全扫描. 提前终止版,如果发现前区里没有发生交换,就说明前区已经有序了,直接终止了.但是有个效率低下的地方,就是右边界hi是每次循环向前移动一个单元 跳跃版,在提前终止版的基础上,解决右边界hi移动效率低下的问题.解决思路:每次循环后,记录下最后一次的交换位置A,然后让hi=交换位置A,所以hi就可以跳跃移动多个单元了. 基本版代码实现 //冒泡排序(基本版 效率低下) template<typename T> void Vect

图文并茂排序与算法

图文并茂排序与算法总结 转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5094764.html 总结下常用的排序算法,方便以后查阅. 常见排序算法:冒泡排序.选择排序.插入排序.壳(shell)排序.合并排序.快速排序.堆排序. 要选择合适的算法,需考虑的因素:执行时间.存储空间和编程工作. 1.选择排序 具有二次方程增长阶,近适用于小列表排序. 通过列表反复扫描,每次扫描选择一项,然后将这一项移动到列表中正确的位置. 选择排序总比较次数=(n-1)+(

Java数据结构 遍历 排序 查找 算法实现

1. 遍历算法(遍历二叉树6种方法) 1.1. 概述 遍历算法针对二叉树而言的,主要有先序.中序.后序三种遍历顺序,三种顺序又分别有递归和常规算法,二叉树遍历的主要思想是:遍历左子树,遍历右子树,访问根节点,由这三者的遍历顺序来确定是先序.中序还是后序.下面只要求掌握递归遍历算法,常规遍历算法见附录一. 1.2. 先序遍历算法 遍历顺序:访问根节点,遍历左子树,遍历右子树.代码如下: void preOrder(BinaryTreeNode bt) { if (bt == null)// 如果当

对大对象进行排序的算法

快速排序就是快速排序,谢尔排序就是谢尔排序.然而,直接应用基于这些算法的函数模板时,如果要排序的Comparable对象很大的话,有时效率会很低.问题就在于.问题就在于重新排列Comparable对象时,进行太多复制Comparable对象的工作.如果Comparable对象很大而且难于复制的话,其代价也会很高. 一般来说,这个问题的解决方案很简单:生成一个指向Comparable的指针数组,然后重新排列这些指针.一旦确定了元素应该在的位置,就可以直接将该元素放在相应的位置上,而不必进行过多的中

C/C++ 排序&amp;&amp;查找算法(面试)

一.排序 1.冒泡排序 1 void BubbleSort(int array[],int n) 2 { 3 int i=0; 4 int j=0; 5 int temp=0; 6 int flag = 0; 7 for(i=0;i<n - 1 ;i++) /*外循环控制排序的总趟数*/ 8 { 9 flag = 0; /*本趟排序开始前,交换标志应为假*/ 10 for(j=n-1;j > i;j--) /*内循环控制一趟排序的进行*/ 11 { 12 if(array[j] < ar

拓扑排序(算法竞赛入门经典)

拓扑排序的定义: 把每个变量看成一个点,”小于“或者”先后“关系看成有向边,则我们得到一个有向图.这样我们的任务实际上是把一个图的所有节点排序,使每一条有向边的(u,v)对应的u都排在v之前,在图论中,我们称之为拓扑排序.不难发现,如果一个有向图里存在回路,则不存在拓扑排序(如果设置一个标志数组,我们可以发现回路中的点一直处于正在被访问状态,这可以作为拓扑排序的结束条件). 我们先看一个样例: 下面我们用邻接矩阵存储这张图:   0 1 2 3 0 0 1 1 1 1 0 0 1 1 2 0 0

内部排序-&gt;交换排序-&gt;起泡排序

文字描述 首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序(L.r[1].key>L.r[2].key),则将两个记录交换位置,然后比较第二个记录和第三个记录的关键字.依次类推,直至第n-1个记录和第n个记录的关键字进行过比较为止.上述过程称为第一趟起泡排序,其结果使得关键字最大的记录被安置到最后一个记录的位置上. 整个起泡排序过程需进行k(k大于等于1且小于n)趟起泡排序,显然判别起泡排序结束的条件应该是排序过程中没有进行过交换记录的操作. 示意图 算法分析 如果待排序序列为&quo

类模板,链表,直接插入排序,选择排序,起泡排序

类模板:使用户可以为类声明一种模式,使类中某些数据成员,某些成员函数的参数,某些成员函数的返回值,能取任意类型. 类模板中,类名后必须跟<模板参数标识符列表> 在主程序中定义对象时,类需说明对象是什么类型,同样用<>括号,在<>尖括号中指定所需类模板的类型. 类模板: template<模板参数表> class 类名 { 类成员声明} 在类模板以外定义成员函数,都要带上template<模板参数表>,指定成员函数属于哪个类时,模板类名后必须跟&l