JavaScript程序:检查数组是否已排序并旋转

什么是数组排序及数组旋转

在编写javascript程序时,有时我们需要对一组数据进行排序,即按照一定的规则对数据进行排列,让数据更易于查找和使用。而数组旋转则是指将一个数组中的元素按照指定的位置进行移动,移动后的数组可能会改变排序顺序。以[4,5,6,1,2,3]为例,经过旋转后变为[1,2,3,4,5,6]。

实现数组排序并旋转的JavaScript程序

步骤1:判断数组是否有序

在实现数组排序并旋转的JavaScript程序中,首先要判断数组是否有序。可以通过遍历数组,比较相邻的元素,判断它们的大小关系是否符合排序规则,即前一个元素小于等于后一个元素。

function isSorted(arr) {

for (var i = 0; i < arr.length - 1; i++) {

if (arr[i] > arr[i + 1]) {

return false;

}

}

return true;

}

上述代码中,我们通过for循环遍历数组,判断相邻元素的大小关系是否符合排序规则。如果有一对相邻元素大小关系不符合排序规则,则返回false,表示数组未排序。

步骤2:判断数组是否旋转

接下来,我们要判断数组是否经过了旋转。可以找到数组中的最小值,并记录其索引。如果最小值的索引不为0,则表示数组已经旋转。

function isRotated(arr) {

var minIndex = 0;

for (var i = 0; i < arr.length; i++) {

if (arr[i] < arr[minIndex]) {

minIndex = i;

}

}

return minIndex !== 0;

}

上述代码中,我们通过for循环遍历数组,找到最小值的索引。如果最小值的索引不为0,则表示数组已经旋转,返回true;否则表示数组未旋转,返回false。

步骤3:将有序数组旋转

如果数组已经排序但未旋转,我们不需要进行任何操作。如果数组已经旋转,我们可以通过将数组从最小值处分为两部分,分别将这两部分反转,再将整个数组反转,即可得到排序并旋转后的数组。

function rotateSortedArray(arr) {

var minIndex = 0;

for (var i = 0; i < arr.length; i++) {

if (arr[i] < arr[minIndex]) {

minIndex = i;

}

}

reverseArray(arr, 0, minIndex - 1);

reverseArray(arr, minIndex, arr.length - 1);

reverseArray(arr, 0, arr.length - 1);

return arr;

}

function reverseArray(arr, start, end) {

while (start < end) {

var temp = arr[start];

arr[start] = arr[end];

arr[end] = temp;

start++;

end--;

}

}

上述代码中,我们先找到最小值的索引,然后分别将最小值之前的部分和最小值之后的部分反转,最后将整个数组反转。可以看到,我们定义了一个reverseArray函数,用于反转一个数组的部分。该函数使用两个指针分别指向数组的起始位置和末尾位置,交换它们的值,然后将两个指针往中间移动,直到两个指针相遇为止。

测试代码及结果

下面是测试代码及结果:

var arr1 = [1,2,3,4,5,6];

console.log(isSorted(arr1)); // true

console.log(isRotated(arr1)); // false

console.log(rotateSortedArray(arr1)); // [1,2,3,4,5,6]

var arr2 = [4,5,6,1,2,3];

console.log(isSorted(arr2)); // false

console.log(isRotated(arr2)); // true

console.log(rotateSortedArray(arr2)); // [1,2,3,4,5,6]

测试结果如下:

true

false

[1,2,3,4,5,6]

false

true

[1,2,3,4,5,6]

总结

本文介绍了如何使用JavaScript编写一个程序来检查数组是否已排序并旋转。我们首先判断数组是否有序,如果未排序则不需要进行任何操作,如果已排序则需要判断数组是否旋转。如果数组已经旋转,则可以通过将数组从最小值处分为两部分,分别将这两部分反转,再将整个数组反转,得到排序并旋转后的数组。