一般来说,判断一个数组或序列是正序,倒序还是乱序,需要我们将这个数组完整的遍历一遍后才能得出答案,它不像折半查找那样只处理少量的数据便能得出结论,因为一段包含成千上万个元素的有序序列,哪怕将其中两个元素的位置调换都能将这个序列变成乱序序列.如下面这段序列,只是数字8和9调换,就变成了乱序的.

[0, 1, 2, 3, 4, 5, 6, 7, 9, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

那么,怎样才能快速的判断序列是否有序呢?

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]  // 序列arrayA
[19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]  // 序列arrayB
[12, 7, 2, 5, 4, 14, 6, 13, 1, 16, 18, 19, 9, 8, 15, 11, 10, 0, 17, 3]  // 序列arrayC

上面三段序列,分别为正序, 乱序和无序, 我们观察发现, 假如用冒泡法排序的单次冒泡循环对以上三个数组进行排序(排序顺序为从小到大),  第一个序列(正序序列)的冒泡次数为0;  第二个序列(倒序序列)的冒泡次数为 : 序列长度 - 1;  第三个序列(乱序序列)的冒泡次数介于上面两种序列之间, 且中途"气泡"(即需要进行交换的元素)发生了变化. 以此为规律,  我们可以利用计数冒泡次数和气泡是否发生了改变来判断一段有限序列是正序, 倒序还是无序.

// 根据数组需要冒泡的次数判断数组为顺序,逆序还是无序public static int lookArray(int[] array) {// 冒泡的次数int count = 0;// 上一次交换的"气泡"int pop = array[0];// 利用单次冒泡检验数组需要冒泡的次数for (int j = 0; j < array.length - 1; j++) {if (array[j] > array[j + 1]) {// 判断此次需要向上冒的气泡是否和上次的相同,不同为乱序if (pop != array[j]) {// 若气泡发生了变化,证明是无序的,停止遍历,返回 0return 0;}int temp = array[j];array[j] = array[j + 1];array[j + 1] = temp;// 两相邻元素交换一次值,count计数一次count++;pop = array[j + 1];//气泡向右移动,可能是逆序,对于逆序序列,还需保证气泡左侧所有的元素大于右侧//所以当左侧最小的元素小于右侧元素时,为无序序列if (j + 2 < array.length ){if (array[j] < array[j+2]){return 0;}}}}// 正序返回 1, 倒序返回 -1if (count == 0) {return 1;} else {return - 1;}}

至此,我们实现了判断序列是否有序的算法. 我们可以在程序主入口main中调用这个方法,用一段乱序序列检验输出:

int[] array = {7,1,2,3,4,5,6,0};
int x = lookArray(array);if (x == 1) {System.out.println("正序");
} else if (x ==  - 1) {System.out.println("逆序");
} else if(x == 0) {System.out.println("无序");
}

输出为:

无序

至此,我们简单的实现了判断一段有限序列为正序,倒序,乱序的判别方法.

判断一个数组是否有序相关推荐

  1. php数组是有序,php判断一个数组是否为有序的方法

    php判断一个数组是否为有序的方法 本文实例讲述了php判断一个数组是否为有序的方法.分享给大家供大家参考.具体分析如下: 这段代码的时间复杂度为O(n) function JudegSortArra ...

  2. php 判定是否是数组,php判断一个数组是否为有序

    php判断一个数组是否为有序 php判断一个数组是否为有序的'方法,涉及php操作数组遍历的相关技巧,非常具有实用价值,需要的朋友可以参考下. 这段代码的时间复杂度为O(n) function Jud ...

  3. 如何判断一个数组是否按顺序排好了

    遍历一次,测试数组是否排好了: // 只是迭代一次,判断一个数组是否按照小到大排序 #include <iostream>using namespace std;bool issort(i ...

  4. PHP如何判断一个数组是一维数组或者是二维数组?用什么函数?

    如题:如何判断一个数组是一维数组或者是二维数组?用什么函数? 判断数量即可 <?php if (count($array) == count($array, 1)) {echo '是一维数组'; ...

  5. Python课堂笔记之判断一个数组中是否含有数字0

    判断一个数组中是否含有数字0的3种方法: lst1=[1,3,4] lst2=[0,6,7] lst3=[[1,3,4],[0,6,7]]#1.如果有0,True for i in range(2): ...

  6. js判断一个数组是否为另一个数组的子集

    一.利用every()和includes() /*js判断一个数组是否为另一个数组的子集*/ let arr1=[1,2,3,null,NaN,undefined,Infinity,'']; let ...

  7. php判断一个数组是否存在在另一个数组中

    /*** ** 判断一个数组是否存在于另一个数组中** @param $arr* @param $allArr* @return boolean*/ function isAllExists($arr ...

  8. php发牌判断哪个玩家对子多,PHP判断一个数组是另一个数组子集的方法详解

    本文实例讲述了PHP判断一个数组是另一个数组子集的方法.分享给大家供大家参考,具体如下: 前言 今天完成一个算法的过程中,有几个需求模块,其中就有判断$a数组是否是$b数组的子集,可能最近我写c比较多 ...

  9. php判断一个数组是另一个数组的子集

    需求 最少的时间复杂度判断$a数组是否是$b数组的子集 // 快速的判断$a数组是否是$b数组的子集 $a = array(135,138); $b = array(135,138,137); 实现方 ...

最新文章

  1. IBM确定公司未来存储技术发展方向
  2. css颜色rgba代码对照表_改善 CSS 的 10 个最佳实践
  3. Remote Desktop Manager 2019中文版
  4. 数据库事务及隔离级别
  5. android 访问服务器josn文件,Android客户端对服务器回来的json文件进行解析
  6. CSS3中的border-radius兼容IE低版本解决方法
  7. 改进粒子系统-GPU实现
  8. 30岁从零学计算机,30岁从零学阅读方法来得及吗?
  9. tc275单片机的内核_TC275开发板学习心得(一)
  10. bzoj 1041: [HAOI2008]圆上的整点
  11. linux下用grep命令根据文件内容进行关键字搜索[linux ubuntu grep] -转
  12. 直播网站源码,简洁的登录页面
  13. 在线式极限学习机OS-ELM
  14. FileZilla 使用技巧
  15. GPU硬件加速的原理
  16. 科隆国际游戏展:戴尔与ALIENWARE展示创新电竞产品
  17. adb如何在linux下安装目录,Linux下Android ADB驱动安装详解
  18. 快递管理系统项目整理
  19. 简述BeanUtils中copyProperties
  20. C++的tie()函数

热门文章

  1. C语言-str家族之strncmp
  2. python循环for不从零开始_从零开始学Python-Day11-循环
  3. Android Audio开发——AAudio基础(十五)
  4. emqtt数据存储mysql_基于Docker部署MQTT Broker(emqtt、EMQ)
  5. Uncaught ReferenceError错误
  6. 2022年全球市场机器人总体规模、主要生产商、主要地区、产品和应用细分研究报告
  7. 购物单问题-带详细注解
  8. 快速 tracert Cyrus
  9. 外籍人士当内资公司法人
  10. 广州房地产契税完税凭证在微信无法下载的解决办法