数组的常用方法(原理)
本文将介绍数组的常用法,包括求最大(小)数,首尾元素交换位置,以及数组元素反转,三种简单排序,数组元素去重和数组元素随机排列。
找数组中的最大(小)数
首先,定义了一个数组 list = [100,30,50,180,70,28,50];和变量max(min),假设变量max(min)的值为数组中的第一个元素,即max(min)=a[0];然后将max(min)与数组元素进行比较,当找到比max(min)大(小)的元素时,重新给max(min)赋值,直至数组中的所有元素都与之比较晚,打印max(min)的值。
代码如下:
function max(arr) {//求最大数
var max = 0;
for (var i = 0; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
数组首尾元素交换位置
首先,确定数组长度,因为数组的下标取值从0开始,值数组长度-1为止,所以,首尾元素交换位置实际上是二者交换;
代码如下:
function changeFL(arr) {//首位数值调换
var i;
i = arr[0];
arr[0] = arr[arr.length - 1];
arr[arr.length - 1] = i;
document.write(arr);
}
由此可以引申出数组元素反向的方法。
数组元素反向
由上面可知,数组元素交换位置实际上是值的交换,首尾交换的元素下标不变,分别为0和。length-1,由此,我们可以对整个数组元素下标进行分析,0 , 1 , 2 ,3 ,4 , 5 ,6;位置0与位置6进行交换,位置1与位置5进行交换,位置2与位置4进行交换,位置3不变,那么我们可以发现,首先,我们需要判断元素长度的奇偶,为奇数时,我们要找到中间值,然后对其他所有元素成对的进行交换;为偶数时,我们可直接对所有元素成对交换。
代码如下:
function reverse(arr) {//数组反向
var i, j;
if (arr.length % 2 == 0) {
for (i = 0; i <= parseInt(arr.length / 2 - 1); i++) {
for (j = arr.length - 1; j > parseInt((arr.length - 1) / 2); j--) {
var k;
if ((i + j) == (arr.length - 1)) {
k = arr[j];
arr[j] = arr[i];
arr[i] = k;
}
}
}
document.write(arr);
} else {
for (i = 0; i <= parseInt(arr.length / 2) - 1; i++) {
for (j = arr.length - 1; j > parseInt(arr.length / 2); j--) {
var k;
if ((i + j) == arr.length - 1) {
k = arr[j];
arr[j] = arr[i];
arr[i] = k;
}
}
}
document.write(arr);
}
}
三种简单排序
冒泡排序
冒泡排序的原理在每次循环结束时,将最大(小)数放置于数组末尾,然后下次循环只比较到倒数第二个数为止,以此类推,最后得到一个按升序(降序)排列的数组。
代码如下:
function sort(arr) {//排序 从小到大 冒泡
var i, j, k;
for (i = 0; i < arr.length - 1; i++) {
for (j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
k = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = k;
}
}
}
document.write(arr);
}
选择排序
选择排序与冒泡排序类似,都是按数组排列由左至右依次比较,区别在于选择排序需要定义一个max(min),将之与数组中的元素一次比较,将最大(小)数放在数组前面,代码如下:
function choose(arr) {//排序 选择
for (var i = 0; i < arr.length; i++) {
min = arr[i];
for (var j = i; j < arr.length; j++) {
if (min > arr[j]) {
min = arr[j];
arr[j] = arr[i];
arr[i] = arr[j];
}
}
}
document.write(arr);
}
快速排序
快速排序的核心在于选取数组的中间元素,左右元素与之比较,分出左右区间,类似于二叉树的生成,然后递归调用,直至左右区间数组长度小于等于1。
代码如下:
function fastSort(arr) {//快速排序
if (arr.length <= 1) {
return arr;
}
var left = [];
var right = [];
var middle = arr.splice(parseInt(arr.length / 2), 1);
for (i = 0; i < arr.length; i++) {
// if (arr[i] != middle) {
if (arr[i] >= middle) {
right[right.length] = arr[i];
} else if (arr[i] < middle) {
left[left.length] = arr[i];
}
}
return fastSort(left).concat(middle, fastSort(right));
}
数组元素去重
function noRepeat(arr) {//过滤重复数
var i, j, k = 0;
c = [];
for (i = 0; i < arr.length - 1; i++) {
for (j = i + 1; j < arr.length; j++) {
if (arr[i] == arr[j]) {
arr[j] = undefined;
}
}
}
for (i = 0; i < arr.length; i++) {
if (arr[i] == undefined) {
continue;
} else {
c[c.length] = arr[i];
}
}
document.write(c);
}
数组元素随机排列
已知一个数组,要求随机生成五个数,并且他们不重复
function randomNumber(arr) {//随机生成五个随机数,要求不重复
var k = parseInt(Math.random() * 5);
for (var i = 0; i < 5; i++) {
if (k == arr[i]) {
d[d.length] = arr[i];
arr[i] = undefined;
}
}
if (d.length <= 4) {
randomNumber(arr);
} else {
document.write(d);
}
}