什么是数组排序及数组旋转
在编写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编写一个程序来检查数组是否已排序并旋转。我们首先判断数组是否有序,如果未排序则不需要进行任何操作,如果已排序则需要判断数组是否旋转。如果数组已经旋转,则可以通过将数组从最小值处分为两部分,分别将这两部分反转,再将整个数组反转,得到排序并旋转后的数组。