生成1-100的随机数:
function getArr() {
var arr = [];
for (var i = 0; i < 10; i++) {
arr.push(Math.floor(Math.random() * (99) + 1));
}
return arr;
}
冒泡排序,大致思路就是找出最大的值冒泡到后面去,最大的冒泡到最后一位,第二大的冒泡到倒数第二位这样,从第一个数开始向后面冒泡,遇到比它大的数就交换位置(比如第一个数的值大于第二个数的值,那么第一个数就和第二个数交换位置),这样一直冒泡下来,经过第一遍冒泡,最后一位数就是最大的.....
function bubble(arr) {
var i, len = arr.length,
j, item;
for (i = 0; i < len; i++) {
for (j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
item = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = item;
}
}
}
return arr;
}
var arr = getArr();
console.log(bubble(arr));
选择排序:大致思路就是先找出最小的值,然后和第一个数交换位置,然后找出第二小的值,然后和第二个数交换位置....
function selectSort(arr) {
var len = arr.length;
var min, item;
for (var i = 0; i < len; i++) {
min = i;
for (var j = i + 1; j < len; j++) {
if (arr[j] < arr[min])
min = j;
}
temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
return arr;
}
arr = getArr();
console.log(selectSort(arr));
插入排序:
function insertSort(arr) {
var len = arr.length,
j, current;
for (var i = 1; i < len; i++) {
j = i;
current = arr[i]; //保留当前的值
while (j > 0 && arr[j - 1] > arr[j]) {
arr[j] = arr[j - 1];
j--;
}
arr[j] = current;
}
return arr;
}
arr = getArr();
console.log(selectSort(arr));
运行过程:
例如arr=[6,5,2,7,1],运行时,i=1,j=1,current=5,那么第一回while变化过程如下:
arr[0]>arr[1],arr变为[6,6,2,7,1],j=0,跳出while循环,然后通过arr[j] = current;变为[5,6,2,7,1]
第二回while变化过程如下:
i=2,j=2,current=2,6>2所以arr变为[5,6,6,7,1],j=1,6>5,所以arr变为[5,5,6,7,1],然后通过arr[j] = current;变为[2,5,6,7,1]
第三回通过while变化arr变为[2,5,6,7,1],然后通过arr[j] = current;变为[2,5,6,7,1]......
快速排序
快速实现简单版:
function ps(arr) {
if (arr.length <= 1) {
return arr;
}
let pivotIndex = Math.floor(arr.length / 2);
let pivot = arr.splice(pivotIndex, 1)[0];
let left = [];
let right = [];
for (let i = 0; i < arr.length; i++) {
if (arr[i] < pivot) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return ps(left).concat([pivot], ps(right));
}
快速实现复杂版:
function quickSort(arr, left, right) {
var len = arr.length;
var partitionIndex,
left = typeof left != 'number' ? 0 : left,
right = typeof left != 'number' ? 0 : right;
if (left < right) {
partitionIndex = partition(arr, left, right);
quickSort(arr, left, partitionIndex - 1);
quickSort(arr, partitionIndex + 1, right);
}
return arr;
}
function partition(arr, left, right) {//找到基准位置
var pivot = left;
index = pivot + 1;
for (var i = index; i <= right; i++) {
if (arr[i] < arr[pivot]) {
swap(arr, i, index);
index++;
}
}
swap(arr, pivot, index - 1);
return index - 1;
}
function swap(arr, i, j) {
var item = arr[i];
arr[i] = arr[j];
arr[j] = item;
}
arr = getArr();
console.log(quickSort(arr, 0, 9));
假设arr=[4,1,3,6,2],left=0,right=4
那么第一次partition,变化过程为:
povit=0,
index=1,i=1,arr=[4,1,3,6,2],
index=2,i=2,arr=[4,1,3,6,2],
index=3,i=3,arr=[4,1,3,6,2],
index=3,i=4,arrr=[4,1,3,2,6],
index=4,i=5(出for循环),
然后arrr=[2,1,3,4,6],返回3
那么数组前一部分[2,1,3](0,2)通过第二次partition,变化为:
povit=0,
index=1,i=1,arr=[2,1,3],
index=2,i=2,arr=[2,1,3],
index=2,i=3(出for循环),
然后arr=[1,2,3],返回1
那么[2](4,4)通过第三次partition,变化为:
povit=4,index=5,i=5...
纵观partition的运行过程,如果arr=[4,1,3,6,2],那么就是[4,1,3,2,6]--》[2,1,3,4,6],要是数组再多几个数,
如果arr=[4,1,3,2,6,7,8,1],那么就是[4,1,3,2,6,7,8,1]--》[4,1,3,2,1,7,8,6]--》[1,1,3,2,4,7,8,6]
index记录的永远是最后一个小于基准的数所在位置+1(比如上例就是6所在位置),当遇到有比基准小的数时(上例为1),数组就把该数和比基准大的数交换位置(1和6交换),然后index+1
所以partition做的事情就是以第一个数为基准,从第二个数开始,把比它小的数向前排在一起,比它大的数向后排在一起(比如第一次partition的变化过程就是[4,1,3,6,2]---》[4,1,3,6,2]---》4,1,3,6,2]---》[4,1,3,2,6]),然后找到最后一个小于它的数所在位置(2所在位置),然后把它和最后一个小于它的数进行交换([4,1,3,2,6]---》[2,1,3,4,6]),这样一来,左边就是小于基准的数,右边就是大于基准的数,然后再把比它小的数进行排序,比它大的数进行排序......
参考文档:
JS的十大经典算法排序