仅使用一个局部变量对数组进行排序

来源:互联网 发布:淘宝一年的费用是多少 编辑:程序博客网 时间: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