对5个数进行排序,需7次比较的方法

本文介绍一个对5个数进行排序的方法,仅使用7次比较。假设要排序的数为a,b,c,d,e。

首先将a,b进行比较,假设结果为a<b,再将c,d进行比较,假设结果为c<d;然后将两组数的较大者进行比较(即比较b,d),假设结果为b<d,于是就有下面的关系,箭头的关系表示“<”,即"小于",至此,已经进行了三次比较。

,这个图的含义为:a<b<d,c<d

现在将e插入到{a,b,d}的适当位置,采用二分查找法寻找查找位置时,只需要两次比较——先同b比较,然后再同a或d比较。将e插入到{a,b,d}时,一共有下面四中结果:

在这四中情况中,要将c插入到由[abcd]组成的序列中最多只需要两次比较。同样使用二分法寻找插入位置。以第一种情况为例:c首先同a比较,如果大于a,再同b比较,如果大于b,则不会再同d比较,因为我们在之前已经知道c<d。

参考文献:计算机程序设计艺术,第三卷,Page:174

完毕

时间: 2024-08-05 11:34:23

对5个数进行排序,需7次比较的方法的相关文章

对10个数进行排序

题目:对10个数进行排序 程序分析:可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个元素交换, 下次类推,即用第二个元素与后8个进行比较,并进行交换. 1 package com.li.FiftyAlgorthm; 2 3 import java.util.Scanner; 4 5 /** 6 * 题目:对10个数进行排序 程序分析:可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个元素交换, 7 * 下次类推,即用第二个元素与后8个进行比较,并进行交换. 8 * @aut

三个数由小到大排序

1 #include <stdio.h> 2 3 int main(void) 4 { 5 int a,b,c; 6 int temp; 7 printf("please input a b c\n"); 8 scanf("%d %d %d",&a,&b,&c); 9 10 if(a>b) 11 { 12 temp=a; 13 a=b; 14 b=temp; 15 16 } 17 if(a>c) 18 { 19 tem

2.用选择排序对10个数进行排序

[原理] 首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置:接着,再从剩余未排序的元素中继续寻找最小(or最大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕. [复杂度和稳定性] (1)选择排序时间复杂度选择排序的时间复杂度是O(N2).假设被排序的数列中有N个数.遍历一趟的时间复杂度是O(N),需要遍历N-1.因此,选择排序的时间复杂度是O(N2). (2)选择排序稳定性选择排序是稳定的算法,它满足稳定算法的定义.算法稳定性 -- 假设在数列中存在

nyoj 41-三个数从小到大排序(STL --&gt; sort(a, a+n) 升序)

41-三个数从小到大排序 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:31 submit:44 题目描述: 现在要写一个程序,实现给三个数排序的功能 输入描述: 输入三个正整数 输出描述: 给输入的三个正整数排序 样例输入: 复制 20 7 33 样例输出: 7 20 33 分析: 直接使用STL库中的sort函数进行排序 C/C++代码实现(AC): #include <iostream> #include <algorithm&g

C++ 排序函数 sort(),qsort()的使用方法

想起来自己天天排序排序,冒泡啊,二分查找啊,结果在STL中就自带了排序函数sort,qsort,总算把自己解脱了~ 所以自己总结了一下,首先看sort函数见下表: 函数名 功能描写叙述 sort 对给定区间全部元素进行排序 stable_sort 对给定区间全部元素进行稳定排序 partial_sort 对给定区间全部元素部分排序 partial_sort_copy 对给定区间复制并排序 nth_element 找出给定区间的某个位置相应的元素 is_sorted 推断一个区间是否已经排好序 p

ORACLE操作表时”资源正忙,需指定nowait&quot;的解锁方法

ORACLE操作表时”资源正忙,需指定nowait"的解锁方法 问题: 执行 drop table table_name 时,提示”资源正忙,需指定nowait"      由于TB_PROJECT为设置主键造成只能查询而无法修改和删除的问题导致PL/SQL无响应,从而对此表一直处于锁定状态 分析: 表示table_name表由某个用户操作时进行了锁定,必须先解锁才能继续进行操作 解决: 1> 通过此语句查询正在锁定的SESSION_ID: SELECT  SESSION_ID 

Java排序需掌握算法 详解

package com.sxt.review; /*内部排序:(在内存) * 插入排序-->希尔排序 * 冒泡排序-->快速排序 * 选择排序-->堆排序 * 归并排序 * 基数排序 * 外部排序:(排序过程需访问外存) */ import java.util.Arrays; public class TestSort { public static void main(String[] args) { int[] arr = { 2, 45, 3, 0, 7, 9, 2, 88 };

三个数从小到大排序—南阳acm

描述: 现在要写一个程序,实现给三个数排序的功能 输入 输入三个正整数 输出 给输入的三个正整数排序 样例输入 20 7 33 样例输出 7 20 33 解题思路是先找出最大和最小的数,再找出中间数,并分步输出,下面是代码 #include<stdio.h>  main() {   int a,b,c,m,n;    scanf("%d%d%d",&a,&b,&c);     m=a>b?a:b;m=m>c?m:c;//找出最大值    

三个数从小到大排序

描述 现在要写一个程序,实现给三个数排序的功能 输入 输入三个正整数 输出 给输入的三个正整数排序 样例输入 20 7 33 样例输出 7 20 33 1 #include <stdio.h> 2 3 int main(){ 4 int a; 5 int b; 6 int c; 7 int temp; 8 9 scanf("%d%d%d",&a,&b,&c); 10 11 if(a>b){ 12 temp=a; 13 a=b; 14 b=tem