下面的排方法中,最坏的情况下比较次数最少的是( ) A冒泡排序 B简单选择排序 C直接插入排序 D 堆排序
来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/05 07:04:47
下面的排方法中,最坏的情况下比较次数最少的是( ) A冒泡排序 B简单选择排序 C直接插入排序 D 堆排序
并帮我解释一下为什么原因,分别在最坏的情况下的次数分别是多少啊?
并帮我解释一下为什么原因,分别在最坏的情况下的次数分别是多少啊?
从原理上给你推导下:
1.冒泡法:这是最原始,也是众所周知的最慢的算法了.他的名字的由来因为它的工作看来象是冒泡:#include void BubbleSort(int* pData,int Count) { int iTemp; for(int i=1;i =i;j--) { if(pData[j] 7,8,10,9(交换2次) 第一轮:7,8,10,9->7,8,9,10(交换1次) 循环次数:6次 交换次数:6次 其他:第一轮:8,10,7,9->8,10,7,9->8,7,10,9->7,8,10,9(交换2次) 第二轮:7,8,10,9->7,8,10,9->7,8,10,9(交换0次) 第一轮:7,8,10,9->7,8,9,10(交换1次) 循环次数:6次 交换次数:3次 上面我们给出了程序段,现在我们分析它:这里,影响我们算法性能的主要部分是循环和交换,显然,次数越多,性能就越差.从上面的程序我们可以看出循环的次数是固定的,为1+2+...+n-1.写成公式就是1/2*(n-1)*n.现在注意,我们给出O方法的定义:若存在一常量K和起点n0,使当n>=n0时,有f(n) 7,10,8,9(交换1次) 第二轮:7,10,8,9->7,8,10,9->7,8,10,9(交换1次) 第一轮:7,8,10,9->7,8,9,10(交换1次) 循环次数:6次 交换次数:3次 从运行的表格来看,交换几乎和冒泡一样糟.事实确实如此.循环次数和冒泡一样 也是1/2*(n-1)*n,所以算法的复杂度仍然是O(n*n).由于我们无法给出所有的情况,所以 只能直接告诉大家他们在交换上面也是一样的糟糕(在某些情况下稍好,在某些情况下稍差).3.选择法:现在我们终于可以看到一点希望:选择法,这种方法提高了一点性能(某些情况下) 这种方法类似我们人为的排序习惯:从数据中选择最小的同第一个值交换,在从省下的部分中 选择最小的与第二个交换,这样往复下去.#include void SelectSort(int* pData,int Count) { int iTemp; int iPos; for(int i=0;i (iTemp=8)8,10,7,9->(iTemp=7)8,10,7,9->(iTemp=7)7,10,8,9(交换1次) 第二轮:7,10,8,9->(iTemp=8)7,10,8,9->(iTemp=8)7,8,10,9(交换1次) 第一轮:7,8,10,9->(iTemp=9)7,8,9,10(交换1次) 循环次数:6次 交换次数:3次 遗憾的是算法需要的循环次数依然是1/2*(n-1)*n.所以算法复杂度为O(n*n).我们来看他的交换.由于每次外层循环只产生一次交换(只有一个最小值).所以f(n) 7,8,9,10(交换1次)(循环1次) 循环次数:4次 交换次数:2次 上面结尾的行为分析事实上造成了一种假象,让我们认为这种算法是简单算法中最好的,其实不是,因为其循环次数虽然并不固定,我们仍可以使用O方法.从上面的结果可以看出,循环的次数f(n)
1.冒泡法:这是最原始,也是众所周知的最慢的算法了.他的名字的由来因为它的工作看来象是冒泡:#include void BubbleSort(int* pData,int Count) { int iTemp; for(int i=1;i =i;j--) { if(pData[j] 7,8,10,9(交换2次) 第一轮:7,8,10,9->7,8,9,10(交换1次) 循环次数:6次 交换次数:6次 其他:第一轮:8,10,7,9->8,10,7,9->8,7,10,9->7,8,10,9(交换2次) 第二轮:7,8,10,9->7,8,10,9->7,8,10,9(交换0次) 第一轮:7,8,10,9->7,8,9,10(交换1次) 循环次数:6次 交换次数:3次 上面我们给出了程序段,现在我们分析它:这里,影响我们算法性能的主要部分是循环和交换,显然,次数越多,性能就越差.从上面的程序我们可以看出循环的次数是固定的,为1+2+...+n-1.写成公式就是1/2*(n-1)*n.现在注意,我们给出O方法的定义:若存在一常量K和起点n0,使当n>=n0时,有f(n) 7,10,8,9(交换1次) 第二轮:7,10,8,9->7,8,10,9->7,8,10,9(交换1次) 第一轮:7,8,10,9->7,8,9,10(交换1次) 循环次数:6次 交换次数:3次 从运行的表格来看,交换几乎和冒泡一样糟.事实确实如此.循环次数和冒泡一样 也是1/2*(n-1)*n,所以算法的复杂度仍然是O(n*n).由于我们无法给出所有的情况,所以 只能直接告诉大家他们在交换上面也是一样的糟糕(在某些情况下稍好,在某些情况下稍差).3.选择法:现在我们终于可以看到一点希望:选择法,这种方法提高了一点性能(某些情况下) 这种方法类似我们人为的排序习惯:从数据中选择最小的同第一个值交换,在从省下的部分中 选择最小的与第二个交换,这样往复下去.#include void SelectSort(int* pData,int Count) { int iTemp; int iPos; for(int i=0;i (iTemp=8)8,10,7,9->(iTemp=7)8,10,7,9->(iTemp=7)7,10,8,9(交换1次) 第二轮:7,10,8,9->(iTemp=8)7,10,8,9->(iTemp=8)7,8,10,9(交换1次) 第一轮:7,8,10,9->(iTemp=9)7,8,9,10(交换1次) 循环次数:6次 交换次数:3次 遗憾的是算法需要的循环次数依然是1/2*(n-1)*n.所以算法复杂度为O(n*n).我们来看他的交换.由于每次外层循环只产生一次交换(只有一个最小值).所以f(n) 7,8,9,10(交换1次)(循环1次) 循环次数:4次 交换次数:2次 上面结尾的行为分析事实上造成了一种假象,让我们认为这种算法是简单算法中最好的,其实不是,因为其循环次数虽然并不固定,我们仍可以使用O方法.从上面的结果可以看出,循环的次数f(n)
下列排序方法中,最坏情况下比较次数最少的是()为什么 A)冒泡排序 B)简单选择排序 C)直接插入排序 D)堆
下面的排方法中,最坏的情况下比较次数最少的是( ) A冒泡排序 B简单选择排序 C直接插入排序 D 堆排序
对于长度为n 的线性表,在最坏情况下,下列各排序法所对应的比较次数中正确的是A)冒泡排序n/2
排序技术中 冒泡法和快速排序法的最坏情况下的比较次数是多少 其时间复杂度分别是多少
157. 下列内部排序算法中: A.快速排序 B.直接插入排序 C.二路归并排序 D.简单选择排序 E.起泡排序
在快速排序, 堆排序,归并排序中 哪个是最稳定的排序方法?
关于选择排序和堆排序为什么说选择排序中比较的次数与初始的顺序无关而堆排序与初始顺序有关?
冒泡排序法是如何排序的?
下列各个排序算法中,要求辅助空间最大的是 A.希尔排序法 B.快速排序法 C.堆排序法 D.二路归并排序法
描述直接插入排序、冒泡排序、直接选择排序的算法(可用任意形式,如流程图、伪码等),并用这3种方式写出
503,087,512,908,170,897,275,653,462冒泡排序、快速排序、直接选择排序、堆排序、归并排序
数据结构求答案单选题 第1题 (2) 分 排序趟数与序列的原始状态有关的排序方法是( )排序法。 A、插入 B、选择 C