仅使用一个局部变量对数组进行排序
来源:互联网 发布:淘宝一年的费用是多少 编辑:程序博客网 时间:2024/06/04 18:34
数组排序是经常被问到的一个技术问题。实现这一功能的排序算法有很多,比如冒泡,选择,快排,归并等等。我们经常被问到阐述这些算法,但很少有人这样问:如何在你的算法中仅定义一个局部变量实现数组的排序。
实际上冒泡排序可以实现这一点,传统的冒泡排序需要三个局部变量,一个i变量做索引,一个布尔变量用于判断是否继续排序,一个temp变量用于交换两个值。下面是冒泡排序的代码示例:
<span style="font-size:14px;">function bubbleSort(arr) { do { var isSwapped = false; for(var i = 0; i < arr.length - 1; ++i) { if(arr[i] > arr[i + 1]) { var temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; isSwapped = true; } } } while (isSwapped); }</span>在这段代码里,三个变量分别是:i,isSwapped,temp。只允许使用一个局部变量,那么需要把isSwapped,temp消除。
首先我们来看temp,使用亦或运算的方法就可以消除这个变量,代码示例如下:
<span style="font-size:14px;">var x = 5, y = 6;x = x^y;y = x^y;x = x^y;</span>接下来要去除的是布尔变量isSwapped,实际上这个变量只是用来标记数组中所有的元素是否已经是有序的。所以可以用索引变量i来代替这个变量。其实我们只需要判断数组长度,每次排序之后判断索引是否小于arr.length-1,知道索引等于arr.length-1结束排序。修改后的代码如下:
<span style="font-size:14px;">function bubbleSort(arr) { do { for(var i = 0; i < arr.length - 1; ++i) { if(arr[i] > arr[i + 1]) { arr[i] = arr[i] ^ arr[i + 1]; arr[i + 1] = arr[i] ^ arr[i + 1]; arr[i] = arr[i] ^ arr[i + 1]; break; } } } while (i < arr.length - 1); }</span>
实际上,这段代码还可以再优化,只需要一层循环即可实现,在每一次交换过后将索引i重置,直到i等于arr.length-1。优化后代码如下:
<span style="font-size:14px;">function bubbleSort(arr) { for(var i = 0; i < arr.length - 1; ++i) { if(arr[i] > arr[i + 1]) { arr[i] = arr[i] ^ arr[i + 1]; arr[i + 1] = arr[i] ^ arr[i + 1]; arr[i] = arr[i] ^ arr[i + 1]; i = -1; } }}</span>快乐的享受编程~~
0 0
- 仅使用一个局部变量对数组进行排序
- 对一个数组,按照给定的下标进行排序,仅使用两两交换的方式
- 【数据结构】对一个数组按给定的下标排序,仅使用两两交换的方式,要求不能对数组进行扩容尽可能使用额外少的空间
- 对一个二维数组进行冒排序
- 对一个数组中的随机数进行排序
- 对一个对象数组进行排序
- 使用sort方法对数组进行排序
- 使用冒泡对数组进行排序
- 使用随机函数初始化一个数组,并对数组进行排序(冒泡排序法和选择排序法)
- 对一个数组按给定的下标排序,仅使用两两交换的方式,要求不能对数组进行扩容尽可能使用额外少的空间。原数组为:A,B,C,D,E, 现给定新的位置为3, 0, 1, 4, 2那么排序为D,A,B,E,C
- 用block变量来对字符数组对象进行排序
- 选择排序算法---对一个数组进行选择排序
- 冒泡排序算法----对一个数组进行冒泡排序
- 对数组进行排序
- 对数组进行排序
- 对数组进行排序
- 使用JavaScript完成一个对字符串数组进行排序的小程序
- 使用冒泡排序算法对数组元素进行排序
- 第七周项目2—建立链队算法库
- 微信万能预约V3.0颠覆式上线,快速、万能!
- Android异步消息处理机制详解及源码分析
- iOS10 跳转后navigationBar 按钮和title消失
- [算法]快速排序算法
- 仅使用一个局部变量对数组进行排序
- gulp前端自动化构建工具(一):工具介绍和使用
- OERR: ORA-12519 错误处理
- TortoiseSVN 右键基础操作
- 区分并发与并行
- 动态加载Fragment
- 区块链开发(五)区块链ICO:互联网进化的驱动力
- MySQL视图操作命令详解
- 【HDU】5930 GCD【暴力+线段树二分】